8
Sorry, wrong answer!
data Expr = Num Integer | Add Expr Expr | Mul Expr Expr
Expression | Haskell representation |
---|---|
2 | Num 2 |
2+2 | Add (Num 2) (Num 2) |
(1+2)*3 | Mul (Add (Num 1) (Num 2)) (Num 3) |
1+2*3 | Add (Num 1) (Mul (Num 2) (Num 3)) |
eval :: Expr -> Integer
eval (Add (Num 1) (Mul (Num 2) (Num 3)))
7
eval :: Expr -> Integer eval (Num n) = n eval (Add a b) = eval a + eval b eval (Mul a b) = eval a * eval b
showExpr :: Expr -> String showExpr (Num n) = show n showExpr (Add a b) = showExpr a ++ "+" ++ showExpr b showExpr (Mul a b) = showExpr a ++ "*" ++ showExpr b
showExpr (Mul (Num 1) (Add (Num 2) (Num 3)))
"1*2+3"
showExpr :: Expr -> String showExpr (Num n) = show n showExpr (Add a b) = showExpr a ++ "+" ++ showExpr b showExpr (Mul a b) = showFactor a++"*"++showFactor b showFactor :: Expr -> String showFactor (Add a b) = "("++ showExpr (Add a b) ++")" showFactor e = showExpr e
instance Show Expr where show = showExpr
Show
showExpr
rExpr_v1 :: Gen Expr rExpr_v1 = oneof [rNum,rBin] where rNum = elements [Num n|n<-[1..10]] rBin = do op <- elements [Add,Mul] e1 <- rExpr_v1 e2 <- rExpr_v1 return (op e1 e2)
rExpr :: Int -> Gen Expr rExpr size = (...)
main = do putStrLn "Welcome to the Arithmetic Quiz!" forever quiz quiz = do e <- generate (rExpr 3) putStr ("\n"++show e++" = ") answer <- getLine let correct = show (eval e) putStrLn (if answer == correct then "Correct!" else "Wrong! The correct answer is: " ++ correct)
data Expr = Num Integer | Add Expr Expr | Mul Expr Expr
eval :: Expr -> Integer eval (Num n) = n eval (Add a b) = eval a + eval b eval (Mul a b) = eval a * eval b
data Expr = Num Integer
| Var Name -- new
| Add Expr Expr
| Mul Expr Expr
type Name = String
vars :: Expr -> [Name] vars (Num n) = [] vars (Var x) = [x] vars (Add a b) = vars a `union` vars b vars (Mul a b) = vars a `union` vars b
union
Data.List
) instead of
++
substitute :: [(Name,Integer)] -> Expr -> Expr substitute :: [(Name,Expr)] -> Expr -> Expr substitute :: (Name->Integer) -> Expr -> Expr substitute :: (Name->Expr) -> Expr -> Expr
eval :: [(Name,Integer)] -> Expr -> Integer
eval env (Num n) = n
eval env (Var x) =
case lookup x env of
Just n -> n
Nothing -> error ("undefined variable: "++x)
eval env (Add a b) = eval env a + eval env b
eval env (Mul a b) = eval env a * eval env b
lookup :: Eq k => [(k,v)] -> k -> Maybe v
error
0
eval
Maybe Integer
data Maybe a = Nothing | Just a
lookup
lookup :: Eq k => [(k,v)] -> k -> Maybe v lookup k [] = Nothing lookup k ((k',v):kvs) | k' == k = Just v | otherwise = lookup k kvs
diff :: Expr -> Name -> Expr
diff :: Expr -> Name -> Expr diff (Num n) x = Num 0 diff (Var y) x = if y==x then Num 1 else Num 0 diff (Add a b) x = Add (diff a x) (diff b x) diff (Mul a b) x = Add (Mul a (diff b x)) (Mul (diff a x) b)
diff (Mul 2 (Var "x")) "x"
2*1+0*x
0+e
e+0
0*e
e*0
1*e
e*1
add
mul
Add
Mul
add (Num 0) b = b add a (Num 0) = a add a b = Add a b
mul (Num 0) b = Num 0 mul a (Num 0) = Num 0 mul (Num 1) b = b mul a (Num 1) = a mul a b = Mul a b
showExpr :: Expr -> String
readExpr :: String -> Expr