[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