How to make a list type an instance of some type class in Haskell 98?Haskell 98 does not support instances on particular composed types like
If I have a type class for conversion to a type
class C a where toX :: a -> X
I can define instances for
instance C Int where toX = ... instance C Double where toX = ... instance C Tuple where toX = ...
instance C String where toX = ...
Illegal instance declaration for `C String' (The instance type must be of form (T a b c) where T is not a synonym, and a,b,c are distinct type variables) In the instance declaration for `C String'
Is there some type class cleverness that can make this work in haskell 98? I can create a new wrapper type for strings:
newtype StringWrap = StringWrap String
and write an instance for that, but then I'll have to litter my code with calls to this constructor.I'm aware of the approach taken by class
adds a extra method to the class:
class C a where toX :: a -> X listToX :: [a] -> X
2 AnswerThe trick in the Prelude is that
If this is not possible in your application then introduce a new class like
class Element a where listToX :: [a] -> X
and define instances like
instance Element Char where listToX = ... instance Element a => C [a] where toX = listToX