packages feed

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