
Thanks that helps a lot! - Tyler On Sun, 2010-02-21 at 04:36 +0100, Daniel Fischer wrote:
Am Sonntag 21 Februar 2010 04:07:50 schrieb Tyler Hayes:
I'm getting an error and I do not know why...
This is what I have:
class Finite a where elements' :: [a]
instance (Finite a, Show a, Show b) => Show (a -> b) where show f = concat (map show [ a | a <- elements'::[a] ])
and this is what ghci gives me:
Could not deduce (Finite a1) from the context () arising from a use of `elements'' at Hw06.lhs:119:42-50 Possible fix: add (Finite a1) to the context of an expression type signature In the expression: elements' :: [a] In a stmt of a list comprehension: a <- elements' :: [a] In the second argument of `map', namely `[a | a <- elements' :: [a]]'
What's going on here?
All type variables are implicitly universally quantified. Thus the type variable a in [a | a <- elements' :: [a] ] is *not* the type variable a from the signature, it's a fresh type variable (and promises something you can't keep, that elements' belongs to *every* list type).
In GHC, you can bring the type variables from the signature into scope by enabling ScopedTypeVariables and explicitly quantifying the type variables:
{-# LANGUAGE ScopedTypeVariables #-} -- or -XScopedTypeVariables on the command line
class Finite a where elements' :: [a]
instance forall a b. (Finite a, Show a, Show b) => Show (a -> b) where show f = concatMap show (elements' :: [a])
But that isn't really a good show instance, it involves neither b nor f, perhaps you'd rather want
instance (Finite a, Show a, Show b) => Show (a -> b) where show f = show [ (x, f x) | x <- elements' ]
and then you don't need ScopedTypeVariables and explicit forall.
Thanks for the help! - Tyler