[Haskell-cafe] Aren't type system extensions fun?

Philippa Cowderoy flippa at flippac.org
Mon May 26 17:55:33 EDT 2008


On Mon, 26 May 2008, Andrew Coppin wrote:

> Thomas Davie wrote:
> > This is perhaps best explained with an example of something that can be
> > typed with rank-2 types, but can't be typed otherwise:
> > 
> > main = f id 4
> > 
> > f g n = (g g) n
> > 
> > We note that the same instance of id must be made to have both the type (Int
> > -> Int) and ((Int -> Int) -> (Int -> Int)) at the same time.  Rank 2 types
> > allows us to do this.
> 
> What a perplexing example! :-}
> 
> Well anyway, I was under the impression that id :: x -> x, so I'm not really
> sure why this wouldn't work without Rank-2 types...
> 

Because f's type can't be written as a rank-1 type - its parameter g must 
be polymorphic (forall x. x->x). With rank-1 types, all the instantiation 
is done by the caller - the function can't require that it receive 
polymorphic parameters.

-- 
flippa at flippac.org

Sometimes you gotta fight fire with fire. Most
of the time you just get burnt worse though.


More information about the Haskell-Cafe mailing list