Revision as of 12:05, 22 May 2007
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 X:
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 = ...
but not for Strings, given that they are a synonym for [Char]. Hence:
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 Show in the prelude, which 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