与haskell中的整数模式匹配给出错误的结果

Pattern matching with integer in haskell gives wrong result

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

1
2
3
4
test :: Integer -> Integer -> String
test num1 num2 = case num1 of
                    num2 ->"foo"
                    otherwise ->"bar"

当我在解释器中加载它时,它会警告我重叠的模式匹配。此外,对于任何两个整数 abtest a b 都会返回 "foo",无论它们是否相等。模式匹配中的 num2 似乎与参数中的不同。

我想知道为什么会这样。我非常感谢您对这种情况的任何见解。


num2 是匹配任何值的模式。总是。它与范围内的现有变量 num2 无关。 (在另一种情况的右侧,此处为 "foo",匹配的值将绑定到名称 num2,隐藏现有名称 num2。但这与此处无关,因为您不无论如何都不要使用 num2。)

想象一下,如果你的所有 map f (x : xs) = f x : map f xs 模式匹配改变了含义,只是因为有人定义了一个名为 x 的顶级变量!

同样,otherwise 是一个匹配一切的模式,与顶级值 otherwise 无关。 otherwise 应该用在像 | otherwise = ... 这样的守卫中;它的定义是 otherwise = True.

在这种情况下,修复程序最简单的方法就是

1
test num1 num2 = if num1 == num2 then"foo" else"bar"