Existential Datatypes

Jeremy Shaw jeremy.shaw@lindows.com
Sun, 30 Jun 2002 12:27:12 -0700


I have a question regarding named fields and existential data types.

I want to extend this example from the User's guide to use named fields:

data Foo = forall a. MkFoo a  (a->Bool)
	 | Nil

foo = MkFoo 'g' isUpper

I tried:

data Foo2 = forall a. MkFoo2 { val2 :: a
			     , func2 :: a -> Bool

But the compiler said:

    Can't combine named fields with locally-quantified type variables
    In the declaration of data constructor MkFoo2
    In the data type declaration for `Foo2'

Then I tried:

data Foo3 = MkFoo3 { val3 :: forall a. a
		   , func3 :: forall a. (a -> Bool)

foo3 = MkFoo3 'g' isUpper

And the compiler said:

    Inferred type is less polymorphic than expected
        Quantified type variable `a' is unified with `Char'
    Signature type:     forall a. a
    Type to generalise: Char
    When checking an expression type signature
    In the first argument of `MkFoo3', namely 'g'
    In the definition of `foo3': MkFoo3 'g' isUpper

Am I doing something wrong, or can GHC just not do what I want yet?
>From what I gathered looking through the mailing list, existential
types are still a bit hacked up?


Jeremy Shaw.