[Haskell] polymorphism and existential types
Louis-Julien Guillemette
guillelj at iro.umontreal.ca
Mon Nov 27 16:15:26 EST 2006
Supposing a polymorphic value (of type, say, forall a . ExpT a t) is
stored inside an existential package (of type, say, forall a . Exp a),
I wonder how to recover a polymorphic value when eliminating the
existential. The ``natural way'' to write this doesn't work:
{-# OPTIONS -fglasgow-exts #-}
data ExpT a t
data Exp a = forall t . Exp (ExpT a t)
f :: (forall a . ExpT a t) -> ()
f e = ()
g :: (forall a . ExpT a t) -> ()
g e =
let e1 :: forall a . Exp a
e1 = Exp e
in case e1 of
Exp e' -> f e'
{-
Test.hs:18:17:
Inferred type is less polymorphic than expected
Quantified type variable `a' is mentioned in the environment:
e' :: ExpT a t (bound at Test.hs:18:11)
In the first argument of `f', namely `e''
In the expression: f e'
In a case alternative: Exp e' -> f e'
Failed, modules loaded: none.
-}
In particular, the solution of pushing the forall inside doesn't work
for me (it breaks other parts of my code...) :
data Exp' = forall t . Exp' (forall a . ExpT a t)
g' :: (forall a . ExpT a t) -> ()
g' e =
let e1 :: Exp'
e1 = Exp' e
in case e1 of
Exp' e' -> f e'
Any help welcome!
Louis-Julien
More information about the Haskell
mailing list