[Haskell-cafe] GADT question

Simon Peyton-Jones simonpj at microsoft.com
Tue Dec 6 05:33:20 EST 2005


 
| I would like the type system to distinguish the three types and
enforce
| their properties. so far, I have come up with the following:
| 
| 
| data Sigma
| data Tau
| data Rho
| 
| data Type a where
|     ForAll :: [Id] -> Type Rho -> Type Sigma
|     Fun :: Type a -> Type a -> Type a
|     TyCon :: TyCon -> Type Tau
|     TyVar :: TyVar -> Type Tau

It looks as if you want a kind of subtyping relationship, so that Tau <
Rho < Sigma.  The standard way to achieve that is using polymorphism
(see, for example, papers about FFI to object-oriented languages)

data Sigma a = S a
data Rho a = R a
data Tau = Tau

data Type a where
|     ForAll :: [Id] -> Type (Sigma (Rho a)) -> Type (Sigma b)
|     Fun :: Type a -> Type a -> Type a
|     TyCon :: TyCon -> Type (Sigma (Rho Tau))
|     TyVar :: TyVar -> Type (Sigma (Rho Tau))

I'm not sure if this would work.

Simon


More information about the Haskell-Cafe mailing list