Hello,

GHC 6.12.3 allows to omit the explicit quantification of
higher-rank type variables using 'forall' in data types if they
appear in a type class context

    {-# LANGUAGE RankNTypes #-}
    data Foo = Foo (Eq a => a)

Is this implicit introduction of 'forall' intended? If it is, why
does it not work in function types? The following is not accepted
by my GHC:

    bar :: Eq b => (Eq a => a) -> b
    bar x = x

The error message is

    All of the type variables in the constraint `Eq a'
are already in scope (at least one must be universally quantified here)
        (Use -XFlexibleContexts to lift this restriction)

Using `FlexibleContexts` the signature of `bar` seems to be
interpreted as

    bar :: (Eq b, Eq a) => a -> b

because then the error becomes

    Couldn't match expected type `b' against inferred type `a'

So unlike in data-type declarations, a 'forall' in a function type
must be written explicitly even if the quantified variable appears in a local type class constraint.

    bar :: Eq b => (forall a . Eq a => a) -> b
    bar x = x

I have not yet installed GHC 7. Is this inconsistency between data and function declarations intended or has it been changed in the new type checker?

Sebastian
_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to