Define the “evaluate (eval
)” function for the following data types of Int expressions.
Type Name = String
data Expr = Var Name | Lit Int --constant
| Expr :+: Expr
| Expr :*: Expr
deriving (Eq, Show)
type Name = String | |
data Expr = Var Name | |
| Lit Int | |
| Expr :+: Expr | |
| Expr :*: Expr | |
deriving (Eq, Show) | |
eval :: Env -> Expr -> Int | |
type Env = [(Name, Int)] | |
eval e (Var s) = lookUp e s | |
eval e (Lit n) = n | |
eval e (x :+: y) = eval e x + eval e y | |
eval e (x :*: y) = eval e x * eval e y | |
lookUp :: Eq a => [(a,b)] -> a -> b | |
lookUp xys x = the [ y | (x', y) <- xys, x == x'] | |
where the [x] = x | |
main = do | |
print $ eval [("P", 3), ("Q", 4)] ((Var "P" :+: Var "Q") :*: Var "Q") -- 28 |