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