[Haskell-cafe] Re: Are GADTs what I need?

Jason Dagit dagit at codersbase.com
Tue Jul 14 02:20:33 EDT 2009

On Mon, Jul 13, 2009 at 10:52 PM, Ashley Yakeley <ashley at semantic.org>wrote:

> Ryan Ingram wrote:
>  data Type a where
>>>   TInt :: Type Int
>>>   TBool :: Type Bool
>>>   TChar :: Type Char
>>>   TList :: Type a -> Type [a]
>>>   TFun :: Type a -> Type b -> Type (a -> b)
> "Type" here is what I call a simple type witness. Simple type witnesses are
> useful because they can be compared by value, and if they have the same
> value, then they have the same type.
> So you can write this:
>  data EqualType a b where
>    MkEqualType :: EqualType t t

Is there any reason to prefer this over:
data EqualType a b where
  MkEqualType :: EqualType a a

In the darcs source code we use a definition similar to the one I just
gave.  I never thought about making the definition like you gave.  I wonder
if it would have changed things, but I'm not sure what.  Your example type
checks the same with both versions of EqualType and a type signature is
required for matchWitness with both definitions.  Playing with the two, I
don't really see any way in which they are different.  Certainly, both
versions of MkEqualType have the same type, but I'm just surprised you don't
have to involve a or b in the type of MkEqualType.

After playing with both definitions for a bit, I think I see why they have
the same type and behave the same way.  Initially I was thinking t was an
existential type, but because of where it appears it is actually universally
quantifed, like the type variable 'a' in my version, so they end up being

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090714/91430642/attachment.html

More information about the Haskell-Cafe mailing list