Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- data Expr = Val Int
- | Add Expr Expr
- | Sub Expr Expr
- | Mul Expr Expr
- | Div Expr Expr
- | If BoolType Expr Expr
- data BoolType = Lit Bool
- | Or BoolType BoolType
- | EqualTo Expr Expr
- | LessThan Expr Expr
- eval :: BoolType -> Bool
- eval (Lit n) = n
- eval (Or e1 e2) = eval e1 || eval e2
- eval (EqualTo e1 e2) = num e1 == num e2
- eval (LessThan e1 e2) = num e1 < num e2
- num :: Expr -> Int
- num (Val n) = n
- num (Add e1 e2) = num e1 + num e2
- num (Sub e1 e2) = num e1 - num e2
- num (Mul e1 e2) = num e1 * num e2
- num (Div e1 e2) = num e1 `div` num e2
- value :: Expr -> Maybe Int
- value (Val n) = Just n
- value (Add e1 e2) = addHelper (value e1) (value e2)
- value (Sub e1 e2) = subHelper (value e1) (value e2)
- value (Mul e1 e2) = mulHelper (value e1) (value e2)
- value (Div e1 e2) = divHelper (value e1) (value e2)
- addHelper Nothing (Just y) = Just y
- addHelper (Just x) Nothing = Just x
- addHelper (Just x) (Just y) = Just (x + y)
- subHelper Nothing (Just y) = Just y
- subHelper (Just x) Nothing = Just x
- subHelper (Just x) (Just y) = Just (x - y)
- mulHelper (Just 0) _ = Just 0
- mulHelper _ (Just 0) = Just 0
- mulHelper Nothing _ = Nothing
- mulHelper _ Nothing = Nothing
- mulHelper (Just x) (Just y) = Just (x * y)
- divHelper Nothing _ = Nothing
- divHelper _ Nothing = Nothing
- divHelper (Just 0) _ = Just 0
- divHelper _ (Just 0) = Nothing
- divHelper (Just x) (Just y) = Just (x `div` y)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement