Haskell についてはよくわかりませんが、本質的には、式ツリーのトラバーサルを行いたいと思うでしょう。
ツリーは EXP: (演算子) (EXP) (EXP) EXP: (const) EXP: (var)
次に、あなたの単純化は擬似コードになります
simplify(Exp e)
if (e is const) return e
else if (e is var) return e
else
{//encode simplification rules
Exp left = simplify(e.left)
Exp right = simplify(e.right)
if(operator is PLUS)
{
if(left == 0) return right;
if(right == 0) return left;
}
else if(operator is MULT)
{
if(left == 1) return right;
if(right == 1) return left;
if(left == 0) return 0;
if(right == 0) return 0;
}
//and so on for other operators
}
これは一種の Java 風ですが、アイデアはそこにあると思います。本質的には、ツリー トラバーサルを行う必要があります。