式ソルバーを実装していますが、パターン マッチングに問題があります。次のコードがあります
data Expression a where
                Const   ∷  Int → Expression Int
                Add ∷  Expression Int → Expression Int → Expression Int
                Sub ∷  Expression Int → Expression Int → Expression Int
eval ∷  Expression a → a
eval (Const a) = a
eval (Add exp1 exp2) = (val1 + val2)
  where
    val1 = eval exp1
    val2 = eval exp2
eval (Sub exp1 exp2) = (val1 - val2)
  where
    val1 = eval exp1
    val2 = eval exp2
しかし、 eval Add と eval Sub は非常に似ているため、別の操作が必要になる可能性があるため、より一般的な実装を行うことを考えていますが、いくつかの問題があります。私は好きなことをしているのに
data Op = Add | Sub
data Expression a where
                Const   ∷  Int → Expression Int
                Op ∷  Expression Int → Expression Int → Expression Int
eval (Op exp1 exp2) = case Op of
                           Add → (val1 + val2)
                           Sub → (val1 - val2)
                      where
                        val1 = eval exp1
                        val2 = eval exp2 
しかし、うまくいきません。このようなことは可能ですか?前もって感謝します