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 |