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