# foralls in newtypes

**Andrew J Bromage
**
ajb@spamcop.net

*Thu, 17 Oct 2002 10:41:12 +1000*

G'day all.
On Wed, Oct 16, 2002 at 07:54:17AM -0700, Hal Daume III wrote:
>* I was reading the HFL libs, namely Control.Monad.Logic, and there's a
*>* definition in there:
*>*
*>* newtype Logic a = Logic { mkLogic :: (forall b. (a -> b -> b) -> b -> b) }
*>*
*>* I'm curious why this is legal, but
*>*
*>* newtype Logic2 a = forall b . Logic2 ((a -> b -> b) -> b -> b)
*>*
*>* is not...
*
Firstly, it's not the same type, but you probably worked that much
out by yourself. You don't want an existentially quantified
constructor at all, what you want is a constructor with a single
argument which has an existentially quantified function type.
Secondly, I've changed the definition of Logic since you looked at
it, so this is no longer valid. We'll look at a simpler example
anyway, using data instead of newtype:
data CPS a = forall b. CPS ((a -> b) -> b)
What should the type of this function be?
mkCPS (CPS x) = x
Cheers,
Andrew Bromage