data Expr = Num Int
| Add Expr Expr
| Mult Expr Expr
deriving (Show)
main = do
print $ simplifyExpr (Add (Add (Num 0) (Num 1)) (Mult (Num 2) (Num 3)))
getLine
simplify (Add (Num 0) x) = x
simplify (Add x (Num 0)) = x
simplify (Mult (Num 1) x) = x
simplify (Mult x (Num 1)) = x
simplify x = x
traverseExpr f (Add x y) = f $ Add (traverseExpr f x) (traverseExpr f y)
traverseExpr f (Mult x y) = f $ Mult (traverseExpr f x) (traverseExpr f y)
traverseExpr _ x = x
simplifyExpr = traverseExpr simplify