fay-0.19: tests/GADTs_without_records.hs
{-# LANGUAGE GADTs #-}
module GADTs_without_records where
data Expr a where
I :: Int -> Expr Int
Plus :: Expr Int -> Expr Int -> Expr Int
B :: Bool -> Expr Bool
IfThenElse :: Expr Bool -> Expr a -> Expr a -> Expr a
false :: Expr Bool
false = B False
true :: Expr Bool
true = B True
eval :: Expr a -> a
eval (I x) = x
eval (Plus a1 a2) = eval a1 + eval a2
eval (B x) = x
eval (IfThenElse p e1 e2) = case eval p of
True -> eval e1
False -> eval e2
n5 = I 5
n2 = I 2
expr1 = Plus n5 n2
expr2 = IfThenElse true expr1 n5
expr3 = IfThenElse false expr1 n5
main = do
when (eval n5 == 5) $ putStrLn "Expected 5: Ok"
when (eval n2 == 2) $ putStrLn "Expected 2: Ok"
when (eval expr1 == 7) $ putStrLn "Expected 7: Ok"
when (eval expr2 == 7) $ putStrLn "Expected 7: Ok"
when (eval expr3 == 5) $ putStrLn "Expected 5: Ok"