4

これが私のコード(の簡略版)です:

data Exp = Var String

test :: Exp -> String -> Bool
test e vIn = case e of
                  Var vIn -> True
                  _       -> False

これを実行すると:

test (Var "X") "Y"

(Var vIn) と (Var s), s ~= vIn を一致させる必要があるため、これは奇妙です。

誰かが何が起こっているのかを説明し、それを修正する方法を提案できますか?

4

2 に答える 2

4

vInあなたのマッチの は関数の引数を隠してvInおり、バインディングは常に成功します。新しい変数にバインドし、パターン ガードを使用して値が等しいことを確認できます。

test e vIn = case e of
                  Var v | v == vIn -> True
                  _       -> False

Varまたは、次を使用する代わりに、直接照合することもできますcase

test (Var v) vIn = v == vInt
于 2013-09-14T19:09:30.263 に答える