这是我的代码(的简化版本):
data Exp = Var String
test :: Exp -> String -> Bool
test e vIn = case e of
Var vIn -> True
_ -> False
当我运行这个:
test (Var "X") "Y"
我得到True,这很奇怪,因为它需要匹配(Var vIn)和(Var s),s〜= vIn。
谁能解释发生了什么,并提出解决方法?
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句