forall a (Ord a => a-> a) -> Int is an illegal type???

Brian Hulley brianh at
Thu Feb 9 03:22:55 EST 2006

Bulat Ziganshin wrote:
> Hello Brian,
> Thursday, February 09, 2006, 9:38:35 AM, you wrote:
>>> the past few months (!) and still can't understand why the following
>>> is an illegal type:
>>> forall a. ((Ord a => a-> a) -> Int)
> i don't know right answer burt may be because "Ord a" restriction and
> "forall a" )"dseclaration" of type variable) should be at the same
> "level". imagine the following declaration:
> forall a. (Int -> (Ord a => a)) -> Int)
> it is not good to write restriction on some deep level instead of
> right together with "declaration"

Thanks! If I understand you correctly, I should think of the "Ord" as being 
part of the "forall" quantifier, so that

       forall a. Ord a =>

is really to be thought of as something like:

      forall_that_is_Ord a =>

and of course quantifiers can't be split up into pieces that are distributed 
all over the place...

If so, then I think I understand it all now, though I'm puzzled why GHC 
chooses to create illegal types instead of finding the innermost 
quantification point ie I would think that

         (Ord a=> a->a) -> Int

should then "obviously" be shorthand for

          (forall a. Ord a=> a->a) -> Int

and surely this could easily be implemented by just prepending "forall a b 
c" onto any context restricting a b c... (?)

Regards, Brian. 

More information about the Glasgow-haskell-users mailing list