
Patrick, I fixed it by adding a type signature to this line: gen = map (const (1::Int)) The problem is that the literal '1' is of type Num t => t, which is never tied to a concrete type anywhere. It has to know the type definitely before it can decide which type class to use. Steve Patrick LeBoutillier wrote:
Hi all,
I've written a small type class that is meant to behave a bit like Show:
class Show a => Echo a where echo :: a -> String echoList :: [a] -> String echoListSep :: a -> String
echo = show echoListSep _ = " "
echoList [] = "" echoList [x] = echo x echoList (x:xs) = echo x ++ echoListSep x ++ echoList xs
instance Echo Char where echo c = [c] echoListSep _ = ""
instance Echo a => Echo [a] where echo = echoList
instance Echo Int where instance Echo Integer where instance Echo Double where instance Echo Float where
gen = map (const 1)
f xs = map echo $ gen xs
However the code doesn't compile on the last line. But it does compile if I replace 'echo' with 'show'. What's missing to make my typeclass behave like Show and accept input of any type (besides all the missing instances...)? I looked at the code for Show but I didn't see anything that looked "magical"...
Thanks,
Patrick