haskell中整数的模式匹配给出了错误的结果
我注意到尝试在haskell中使用参数执行模式匹配并不总是有效的。下面是一个例子:haskell中整数的模式匹配给出了错误的结果,haskell,pattern-matching,Haskell,Pattern Matching,我注意到尝试在haskell中使用参数执行模式匹配并不总是有效的。下面是一个例子: test :: Integer -> Integer -> String test num1 num2 = case num1 of num2 -> "foo" otherwise -> "bar" 当我将其加载到解释器中时,它会警告我重叠的模式匹配。此外,测试a b中的任意两个整数a和b返回“foo”,无论
test :: Integer -> Integer -> String
test num1 num2 = case num1 of
num2 -> "foo"
otherwise -> "bar"
当我将其加载到解释器中时,它会警告我重叠的模式匹配。此外,测试a b
中的任意两个整数a
和b
返回“foo”
,无论它们是否相等。模式匹配中的num2
似乎与参数中的不同
我想知道为什么会发生这种事。我非常感谢您能深入了解情况。
num2
是一种匹配任何值的模式。总是。它与范围内的现有变量num2
无关。(在案例备选方案的右侧,此处为“foo”
,匹配的值将绑定到名称num2
,隐藏现有名称num2
。但这与此处无关,因为您无论如何都不使用num2
)
想象一下,如果您所有的map f(x:xs)=fx:map fxs
模式都匹配更改的含义,仅仅因为有人定义了一个名为x
的顶级变量
类似地,否则
是一种匹配所有内容的模式,与顶级值否则
无关否则
应该用于像|否则=…
;其定义为否则=True
在这种情况下,修复程序最简单的方法就是
test num1 num2 = if num1 == num2 then "foo" else "bar"
你说的很准确:“模式匹配中的
num2
与参数中的不一样”。相关:你说“与顶级值无关,否则”是什么意思<代码>否则
是在序言
中定义的顶级值。您可以隐藏它:导入前奏隐藏(否则)
。还是我误解了你?@user3237465在模式匹配中,否则
不是指值True
。怎么可能呢?无法将num2(一个数字)与True
匹配。相反,它的作用类似于定义为True
的,因为它匹配任何东西:因为它是一种永不不匹配的模式。除了否则
你同样可以写\uu
或者蝙蝠侠
@amalloy,啊,我忽略了问题中的否则
。