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

David Menendez zednenem at psualum.com
Fri Feb 10 01:41:03 EST 2006


Brian Hulley writes:

> I've been puzzling over section 7.4.9.3 of the ghc users manual for
> the past few months (!) and still can't understand why the following
> is an illegal type:
> 
> forall a. ((Ord a => a-> a) -> Int)
> 
> whereas
> 
> (forall a. Ord a => a->a) -> Int
> 
> is legal. I can understand why the second one *is* legal but I can't
> seem to understand why the first syntax is not just exactly the same
> thing even though the parse tree is different.

I see you already clarified this, but I'd like to point out that

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

and

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

are very different. The first essentially takes two arguments, a type
|a| and a value of type |a -> a|. The second takes a single argument of
type |forall a. a -> a|.
 
There are some type systems (like JHC core, IIRC) which treat "forall"
and "->" as special cases of the dependent product. That is, "T -> U" is
short for "Pi _:T. U" and "forall a. T" is short for "Pi a:*. T". Using
that syntax, the types above become:

    Pi a:*. Pi _:(Pi _:a. a). Int

and

    Pi _:(Pi a:*. Pi _:a. a). Int
-- 
David Menendez <zednenem at psualum.com> | "In this house, we obey the laws
<http://www.eyrie.org/~zednenem>      |        of thermodynamics!"


More information about the Glasgow-haskell-users mailing list