Okay thanks I got the difference between both. The 'exists' syntax seems very useful. Is it planned to be added to GHC in a near future?
2011/2/28 Heinrich Apfelmus <[email protected]> > Yves Parès wrote: > >> takeC :: Int -> Compoz a b -> (exists c. Compoz a c) >>> dropC :: Int -> Compoz a b -> (exists c. Compoz c b) >>> >> >> What does 'exists' means? To create a rank-2 type can't you use: >> >> takeC :: Int -> Compoz a b -> (forall c. Compoz a c) >> >> ?? >> > > Ah, (exists c. Compoz a c) means "There exists a type c such that the > whole thing has type Compoz a c ". > > What you describe would be the type "For any type c the whole thing can > be treated as having type Compoz a c " which is something entirely > different. > > The point is that in the former version, the function takeC determines > what the type c should be and the caller has no clue what it is. In the > latter version, the function that calls takeC can choose which type it > should be. > > What I wrote is *not* legal Haskell. (At least not in GHC. If I remember > correctly, the EHC from Utrecht supports first-class existential > quantification ). You have to encode it in some way, for instance with a > data type > > data Exists f = forall c . Exists (f c) > takeC :: Int -> Compoz a b -> Exists (Compoz a) > > > > Regards, > Heinrich Apfelmus > > -- > http://apfelmus.nfshost.com > > > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe >
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
