Given:
data Foo =
FooString String
…
class Fooable a where --(is this a good way to name this?)
toFoo :: a -> Foo
I want to make String
an instance of Fooable
:
instance Fooable String where
toFoo = FooString
GHC then complains:
Illegal instance declaration for `Fooable String'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Fooable String'
If instead I use [Char]
:
instance Fooable [Char] where
toFoo = FooString
GHC complains:
Illegal instance declaration for `Fooable [Char]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are type *variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Fooable [Char]'
Question:
- Why can I not make String and instance of a typeclass?
- GHC seems willing to let me get away with this if I add an extra flag. Is this a good idea?
{-# LANGUAGE FlexibleInstances #-}
(or any other pragma) at the top of your .hs file. – Dan BurtonString
instance and not an instance for lists you would actually writeinstance Char ~ char => Fooable [char] where ..
but usually you will want to follow Lemming's advice. Another approach is to enableOverloadedStrings
and define:instance IsString Foo where fromString :: String -> Foo; isString = FooString
– Iceland_jack