式ソルバーを実装していますが、パターン マッチングに問題があります。次のコードがあります
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
しかし、うまくいきません。このようなことは可能ですか?前もって感謝します