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