[Haskell-cafe] Moving "forall" over type constructors

Klaus Ostermann ko at daimi.au.dk
Mon Jun 9 09:20:33 EDT 2008

At first I'd like to thank Claus, Ryan, Edsko, Luke and Derek for their 
quite helpful replies to my previous thread.

In the course of following their advice I encountered the problem of 
moving a "forall" quantifier over a wrapper type constructor.

If I have

 > newtype Wrapper a = Wrapper a
and I instantiate Wrapper with a polymorphic type, then it is possible 
to move the quantifier outside:

 > outside :: Wrapper (forall a. (t a)) -> (forall a. Wrapper (t a))
 > outside(Wrapper x) = Wrapper x

(surprisingly the code does not work with the implementation 'outside x 
= x'; I guess this is a ghc bug)

However, the other way around does not work:

 > inside :: (forall a. Wrapper (t a))-> Wrapper (forall a. (t a))
 > inside x= x

results in the following error:

Couldn't match expected type `forall a. t a'
       against inferred type `t a'
  Expected type: Wrapper (forall a1. t a1)
  Inferred type: Wrapper (t a)
In the expression: x
In the definition of `inside': inside x = x

Any ideas on how to make this work?


More information about the Haskell-Cafe mailing list