[Haskell-cafe] Simple GADT parser for the eval example
Ulf Norell
ulfn at cs.chalmers.se
Tue Oct 31 05:51:10 EST 2006
On Oct 31, 2006, at 2:19 AM, Dimitrios Vytiniotis wrote:
> -- Give a GADT for representation types
> data R a where
> Rint :: R Int
> Rbool :: R Bool
> Rpair :: R a -> R b -> R (a,b)
>
> -- Give an existential type with a type representation
> data TermEx where
> MkTerm :: R a -> Term a -> TermEx
>
> -- we use Weirich's higher-order type-safe cast to avoid deep
> traversals
> -- one can replace the type_cast with a more simple traversal-based
> -- version.
...complicated higher order stuff...
For instance:
> data a :==: b where
> Refl :: a :==: a
>
> (===) :: Monad m => R a -> R b -> m (a :==: b)
> Rint === Rint = return Refl
> Rbool === Rbool = return Refl
> Rpair a b === Rpair c d = do
> Refl <- a === c
> Refl <- b === d
> return Refl
> a === b = fail $ show a ++ " =/= " ++ show b
>
> cast :: a :==: b -> c a -> c b
> cast Refl x = x
In particular one wants to extract the Term part of a TermEx:
> getTerm :: Monad m => TermEx -> R a -> m (Term a)
> getTerm (MkTerm r' t) r = do
> Refl <- r === r'
> return t
/ Ulf
More information about the Haskell-Cafe
mailing list