意外的模式匹配行为

用户名

这是我的代码(的简化版本):

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

或者,如果可以的话,Vartest方程式中使用防护和模式匹配

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用具有参数化类型的特征的意外模式匹配行为

来自分类Dev

意外的Lua模式匹配结果

来自分类Dev

sshd_config中的意外匹配行为

来自分类Dev

使用模式匹配的奇怪perl foreach行为

来自分类Dev

Vim:cn在插入模式下的意外行为

来自分类Dev

由于Swift模式匹配中的顺序而导致的意外结果

来自分类Dev

正则表达式意外的模式匹配

来自分类Dev

将模式匹配与Mixins结合使用时出现奇怪的行为

来自分类Dev

两种模式都匹配的awk提取行为true

来自分类Dev

匹配行为%in%

来自分类Dev

将组织模式文件导出到HTML后,意外的链接行为

来自分类Dev

python文本文件在“ r +”模式下的意外读取/写入行为

来自分类Dev

本地二进制模式中的意外行为-python skimage

来自分类Dev

在 ubuntu 上给出 [0-9] 模式时 grep 意外行为

来自分类Dev

在R中匹配'+'时在pmatch中出现意外行为

来自分类Dev

在R中匹配'+'时在pmatch中出现意外行为

来自分类Dev

Python:{n}匹配出现意外的正则表达式行为

来自分类Dev

意外的CSS行为

来自分类Dev

Delphi的意外覆盖行为

来自分类Dev

线程的意外行为

来自分类Dev

意外的数据绑定行为

来自分类Dev

意外的指针行为

来自分类Dev

意外的rand()行为?

来自分类Dev

glDrawArrays意外行为

来自分类Dev

save(),意外行为

来自分类Dev

StackOverflowError意外行为

来自分类Dev

PHPExcel意外的浮动行为

来自分类Dev

与CompletableFuture意外的行为

来自分类Dev

意外的id方法行为