Hi,
I have very simple code:
class XmlValue a where
toValue :: a -> String
instance XmlValue String where
toValue _ = "lorem"
It gives following error:
Illegal instance declaration for `XmlValue 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.)
So, maybe I'll remove that synonym:
instance XmlValue [Char] where
toValue _ = "lorem"
This gives following error:
Illegal instance declaration for `XmlValue [Char]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*, and each type
variable appears at most once in the instance head. Use -XFlexibleInstances if you want
to disable this.)
So, maybe I'll try to use that (T a1 ... an)
form:
instance XmlValue ([] String) where
toValue _ = "lorem"
Illegal instance declaration for `XmlValue [String]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*, and each type
variable appears at most once in the instance head. Use -XFlexibleInstances if you want
to disable this.)
Ok. Maybe I'll try to enable FlexibleInstances with {-#
LANGUAGE FlexibleInstances #-}
Ok, this works, but:
http://stackoverflow.com/questions/15285822/cant-make-string-an-instance-of-a-class-in-haskell
(second answer):
"
However, Haskell98 forbids this type of typeclass in order to
keep things simple and to make it harder for people to write
overlapping instances like
instance Slang [a] where
-- Strings would also fit this definition.
slangify list = "some list"
"
Ok, that's bad. But I want only [Char], [a] shouldn't work.
https://ghc.haskell.org/trac/haskell-prime/wiki/FlexibleInstances says, that I'll get all or nothing.
I want to enable "instance [Char] where..." but disable "instance [a] where...". Is it possible?
Thanks,
Emanuel