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”,无论

我注意到尝试在haskell中使用参数执行模式匹配并不总是有效的。下面是一个例子:

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,啊,我忽略了问题中的
否则