hid-examples-0.5: ch11/expr-gadt/Main.hs
{-# LANGUAGE GADTSyntax #-}
{-# LANGUAGE GADTs #-}
data Expr' a = Lit' a | Add' (Expr' a) (Expr a) | Mult' (Expr' a) (Expr' a)
data Expr'' a where
Lit'' :: a -> Expr'' a
Add'' :: Expr'' a -> Expr'' a -> Expr'' a
Mult'' :: Expr'' a -> Expr'' a -> Expr'' a
data Expr a where
NumLit :: Num a => a -> Expr a -- CHANGED
BoolLit :: Bool -> Expr Bool -- NEW
Add :: Num a => Expr a -> Expr a -> Expr a
Mult :: Num a => Expr a -> Expr a -> Expr a
IsZero :: (Num a, Eq a) => Expr a -> Expr Bool -- NEW
If :: Expr Bool -> Expr a -> Expr a -> Expr a -- NEW
myeval :: Expr a -> a
myeval (NumLit e) = e
myeval (BoolLit b) = b
myeval (Add e1 e2) = myeval e1 + myeval e2
myeval (Mult e1 e2) = myeval e1 * myeval e2
myeval (IsZero e) = myeval e == 0
myeval (If be e1 e2) = myeval (if myeval be then e1 else e1)
expr = If (IsZero (Add (NumLit 5) (NumLit (-5)))) (NumLit 0.5) (NumLit 1)
data SomeExpr where
Some :: Expr a -> SomeExpr
main = print $ myeval $ expr