PS to my earlier message.  I am not at all certain that 
the Odersky/Laufer thing would in fact solve Janis's problem.
You want not only a rank-3 type, but also higher-order unification,
since you want to instantiate 't' to
        \c. forall d . (c->d) -> d -> d 

That may just be too hard. But I'm out of my depth here. 
Maybe a types expert can help.

Simon

| -----Original Message-----
| From: Simon Peyton-Jones [mailto:[EMAIL PROTECTED]] 
| Sent: 24 October 2001 09:08
| To: Janis Voigtlaender; [EMAIL PROTECTED]
| Subject: RE: rank 2-polymorphism and type checking
| 
| 
| Here's the story
| 
| * GHC understands only rank-2 types; your type is rank 3
| 
| * The reason for this is that type inference for higher-rank 
| types is tricky.
|    GHC just squeezes through the door with rank-2 types by 
| using a neat
|    hack, but the hack just doesn't cope with higher ranks at all.
| 
| * GHC 4.08 didn't *check* that the type is rank-2, whereas 
| ghc 5.02 does.
|   So all versions of your program will be rejected by GHC now, before
|   it ever gets to type checking.
| 
| * It's true that your test' *does* typecheck in GHC 4.08, but 
| it's a coincidence!
|   Certain very special programs will work even with higher 
| rank types, but
|    its jolly hard to explain which, so GHC 5 chucks them all out.
| 
| * Nevertheless your program makes perfect sense. I believe 
| that the Right
|   Thing to do is to adopt Odersky/Laufer's idea of "Putting 
| Type Annotations
|    To Work" (POPL 96).  They show how to typecheck 
| arbitrarily high rank
|    type provided there are enough type annotations, and Mark 
| Shields has
|    recently explained it all to me.  But implementing this 
| would be real work.
| 
| So I'm interested to know: if GHC allowed arbitrarily-ranked 
| types, who would use them?
| 
| Simon
| 
| 
| 
| | -----Original Message-----
| | From: Janis Voigtlaender [mailto:[EMAIL PROTECTED]]
| | Sent: 24 October 2001 08:00
| | To: [EMAIL PROTECTED]
| | Subject: Re: rank 2-polymorphism and type checking
| | 
| | 
| | Iavor S. Diatchki writes:
| | 
| | > > > test :: (forall t . (forall a . t a) -> t b) -> b -> b
| | > i am not an expert on this, but isnt this rank 3?
| | 
| | Might be. Does this mean I cannot write it in Haskell? But, with
| | 
| |  data T a = C
| | 
| | I can write:
| | 
| |  test' :: (forall t . (forall a . t a) -> t b) -> b -> b  
| test' g x = 
| | case g C of C -> x
| | 
| | Here, the type checker finds out on its own that t is
| | instantiated to T. Still, 
| | why are the annotations in the following code not enough to 
| | let it also accept 
| | the definition of "test" (see my earlier message), 
| | respectively how can I tell 
| | it that t should be instantiated to t c = forall d . (c->d) 
| | -> d -> d ?
| | 
| |  test :: (forall t . (forall a . t a) -> t b) -> b -> b
| |  test g x = (g           :: (forall a . (forall d . (a->d) -> 
| | d -> d)) ->
| | (forall e . (b->e) -> e -> e))
| |             ((\f y -> y) :: (forall a . (forall d . (a->d) -> 
| | d -> d)))
| |             (id          :: (b -> b)) 
| |             (x           :: b)
| | 
| | 
| | --
| | Janis Voigtlaender
| | http://wwwtcs.inf.tu-dresden.de/~voigt/
| | mailto:[EMAIL PROTECTED]
| | 
| | 
| | _______________________________________________
| | Haskell mailing list
| | [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
| | 
| 
| _______________________________________________
| Haskell mailing list
| [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
| 

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to