[Haskell-beginners] help with error
Daniel Fischer
daniel.is.fischer at web.de
Sat Feb 20 22:36:32 EST 2010
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
More information about the Beginners
mailing list