Haskell 不允许匹配模式中的变量,因为这需要这些变量的类型是Eq
. 例如,这不起作用
isEqual :: Int -> Int -> Bool
isEqual a a = True
isEqual _ _ = False
它给出了错误:
Conflicting definitions for `a'
...
In an equation for `isEqual
如果 Haskell 不允许这样的事情,那为什么你的例子会编译呢?在您的代码中发生的情况是,语句中的vIn
变量会隐藏在待测方程中绑定的变量。如果您使用以下标志进行编译,编译器还会警告您:case
vIn
-Wall
code.hs:7:18: Warning:
This binding for `vIn' shadows the existing binding
bound at code.hs:6:8
这意味着有两个 vIn
变量,它们不相等,只有内部的变量是可见的,因为它会影响外部的变量。
要修复代码,您必须明确地将函数参数与vIn
案例中匹配的值进行比较:
data Exp = Var String
test :: Exp -> String -> Bool
test e x = case e of
Var vIn -> vIn == x -- Explicitly compare vIn to x
_ -> False
或者,如果可以的话,只需Var
在等式中使用守卫和模式匹配:test
data Exp = Var String
test :: Exp -> String -> Bool
test (Var a) vIn
| a == vIn = ... {- Code for the case that vIn == a -}
| otherwise = False