Polymorphic components, so far
simonpj at microsoft.com
Fri Feb 2 03:35:01 EST 2007
Thank you for the summery Iavor
On the rank-2 vs rank-N issue, I can say this:
* Rank-N is really no harder to implement than rank-2. The "Practical type inference.." paper gives every line of code required". The design is certainly much cleaner and less ad-hoc than GHC's old rank-2 design, which I dumped with considerable relief.
* I think it'd be a pity to have an arbitrary rank-2 restriction. Rank-2 allows you to abstract over a polymorphic function. Well, it's no too long before you start wanting to abstract over a rank-2 function, and there you are.
* The ability to put foralls *after* a function arrow is definitely useful, especially when type synonyms are involved. Thus
type T = forall a. a->a
f :: T -> T
We should consider this ability part of the rank-N proposal. The "Practical type inference" paper deal smoothly with such types. GHC's rank-2 design had an arbitrary and unsatisfactory "forall-hoisting" mechanism which I hated.
* For Haskell Prime we should not even consider option 3. I'm far from convinced that GHC is occupying a good point in the design space; the bug that Ashley points out (Trac #1123) is a good example. We just don't know enough about (type inference for) impredicativity.
In short, Rank-N is a clear winner in my view.
| -----Original Message-----
| From: haskell-prime-bounces at haskell.org [mailto:haskell-prime-bounces at haskell.org] On Behalf Of Iavor
| Sent: 02 February 2007 00:25
| To: Haskell Prime
| Subject: Re: Polymorphic components, so far
| (Apologies for the two emails, I accidentally hit the send button on
| my client before I had finished the first e-mail...)
| * Rank-2 vs Rank-n types. I think that this is the most important
| issue that we need to resolve which is why I am placing it first :-)
| Our options (please feel free to suggest others)
| - option 1: Hugs style rank-2 types (what I described , very
| briefly, on the ticket)
| * Based on "From Hindley Milner Types to First-Class Structures"
| * Predicative
| * Requires function with rank-2 types to be applied to all their
| polymorphic arguments.
| - option 2: GHC 6.4 style rank-N types. As far as I understand,
| these are the details:
| * Based on "Putting Type Annotations to Work".
| * Predicative
| * We do not compare schemes for equality but, rather, for
| generality, using a kind of sub-typing.
| * Function type constructors are special (there are two of them)
| because of co/contra variance issues.
| - option 3: GHC 6.6 style rank-N types. This one I am less familiar
| with but here is my understanding:
| * Based on "Boxy types: type inference for higher-rank types and
| * Impredicative (type variables may be bound to schemes)
| * Sometimes we compare schemes for equality (this is
| demonstrated by the example on ticket 57) and we also use the
| sub-typing by generality on schemes
| * Again, function types are special
| So far, Andres and Stephanie prefer a system based on rank-N types
| (which flavor?), and I prefer the rank-2 design. Atze would like a
| more expressive system that accepts the example presented on the
| I think this is all.
| Haskell-prime mailing list
| Haskell-prime at haskell.org
More information about the Haskell-prime