blob: 67d17c7a67e60646fec022e3da0f28d032461806 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
{-# LANGUAGE GADTs, ExistentialQuantification, KindSignatures, RankNTypes #-}
-- Succeeds (needs the (Ord a) in TypeSet
-- c.f. gadt21.hs
-- However, it's a useful test because it unearthed a bug
-- in free-variable-finding
module Expr where
import Data.Set (Set)
data Type a where
TypeInt :: Type Int
TypeSet :: Ord a => Type a -> Type (Set a)
TypeFun :: Type a -> Type b -> Type (a -> b)
data Expr :: * -> * where
Const :: Type a -> a -> Expr a
data DynExpr = forall a. DynExpr (Expr a)
withOrdDynExpr :: DynExpr -> (forall a. Ord a => Expr a -> b) -> Maybe b
withOrdDynExpr (DynExpr e@(Const (TypeSet _) _)) f = Just (f e)
withOrdDynExpr (DynExpr e@(Const TypeInt _)) f = Just (f e)
withOrdDynExpr _ _ = Nothing
|