[Haskell-cafe] translation between two flavors of lexically-scoped type variables
Kangyuan Niu
kangyuan.niu at gmail.com
Thu Jul 5 06:55:39 CEST 2012
The paper "Lexically scoped type variables" by Simon Peyton Jones and Mark
Shields describes two ways to give type variables lexical scoping. They
state that one of the advantages of the GHC-style type-sharing approach
over the SML-style type-lambda approach is that the former allows for
existential quantification in addition to universal quantification. As an
example, they give this code:
data Ap = forall a. Ap [a] ([a] -> Int)
The constructor `Ap` has the type:
Ap :: forall a. [a] -> ([a] -> Int) -> Ap
And one can write a function:
revap :: Ap -> Int
revap (Ap (xs :: [a]) f) = f ys
where
ys :: [a]
ys = reverse xs
with the annotations on `xs` and `ys` being existential instead of
universal.
But I'm a little confused about *why* type-lambdas don't allow this. Aren't
both Haskell and SML translatable into System F, from which type-lambda is
directly taken? What does the translation for the above code even look
like? Why isn't it possible to write something like:
fun 'a revap (Ap (xs : 'a list) f) = f ys
where
ys :: 'a list
ys = reverse xs
in SML?
-Kangyuan Niu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120705/510c9801/attachment.html>
More information about the Haskell-Cafe
mailing list