List instance
From HaskellWiki
1 Question
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 likeString
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 = ...
[Char]
instance C String where toX = ...
results in:
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 classShow
adds a extra method to the class:
class C a where toX :: a -> X listToX :: [a] -> X
X
[a]
X
[Char]
2 Answer
The trick in the Prelude is thatlistToX
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
.
3 Source
http://www.haskell.org/pipermail/haskell-cafe/2007-May/025742.html
