Assignment 4
Solution
Exactly 6 lines of code needed to be modified to complete the assignment. First, the Expr
type needed to be modified to represent sums and products of arbitrary numbers of expressions.
This:
data Expr = Num Int
| Neg Expr
| Add Expr Expr
| Mul Expr Expr
becomes this:
data Expr = Num Int
| Neg Expr
| Add [Expr]
| Mul [Expr]
Second, the eval
function needs to be modified to evaluate Add
and Mul
.
This:
eval (Add x y) = eval x + eval y
eval (Mul x y) = eval x * eval y
becomes this:
eval (Add xs) = sum $ map eval xs
eval (Mul xs) = product $ map eval xs
Finally, the parsers for Add
and Mul
need to be modified to parse multiple expressions and return a list to the constructors (Add
and Mul
are now no longer constructors that take two Expr
values but that take a single value of type [Expr]
).
This:
add :: Parser Expr
add = Add <$> ((spaceChar '+') *> expr) <*> expr
becomes this:
add :: Parser Expr
add = Add <$> ((spaceChar '+') *> some expr)
and similarly for mul
.