[Haskell-cafe] Class
Slavomir Kaslev
slavomir.kaslev at gmail.com
Wed Nov 1 18:06:05 EST 2006
Hello.
I am new to Haskell and I am going through "Haskell: The craft of
functional programming". I am trying to grasp haskell's classes and
instances, so here is slightly modified code from the book:
class Show a => Visible a where
toString :: a -> String
toString = show
size :: a -> Int
size = length . show
instance Visible a => Visible [a] where
toString = concat . map toString
size = foldl (+) 0 . map size
vSort :: (Visible a, Ord a) => [a] -> String
vSort = toString . List.sort
s = vSort [1..3]
Unfortunetly in ghc it gives the following type error:
Ambiguous type variable `a' in the constraints:
`Visible a' arising from use of `vSort' at d:/tmp.hs:83:4-8
`Enum a' arising from the arithmetic sequence `1 .. 3' at
d:/tmp.hs:83:10-15
`Num a' arising from the literal `3' at d:/tmp.hs:83:14
`Ord a' arising from use of `vSort' at d:/tmp.hs:83:4-8
Probable fix: add a type signature that fixes these type variable(s)
Failed, modules loaded: none.
As you can see, Visible is nothing more than an adapter to the Show
class. How I got thing so far, [1..3] :: (Num a, Enum a) => [a], has a
Show instance so does class Num (which 'subclasses' Show). Therefore,
I can't see any reason why toString function can't call show from
those instances.
Can someone please enlighten my (still) C++ thinking head?
--
Slavomir Kaslev
More information about the Haskell-Cafe
mailing list