Pattern matching with integer in haskell gives wrong result
我注意到尝试在 haskell 中使用参数执行模式匹配并不总是有效。这是一个例子:
当我在解释器中加载它时,它会警告我重叠的模式匹配。此外,对于任何两个整数 a 和 b,test a b 都会返回 "foo",无论它们是否相等。模式匹配中的 num2 似乎与参数中的不同。
我想知道为什么会这样。我非常感谢您对这种情况的任何见解。
- 您几乎准确地说出了它发生的原因:"模式匹配中的 num2 与参数中的不一样"。
-
相关:stackoverflow.com/questions/9336385/...
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" |
- 你是什??么意思"与顶级值otherwise无关"? otherwise 是在 Prelude 中定义的顶级值。您可以隐藏它:import Prelude hiding (otherwise)。还是我误会了你?
-
@user3237465 在模式匹配中,otherwise 不是指值 True。怎么可能?您不能将数字 num2 与 True 匹配。相反,它的行为类似于定义为 True 的 otherwise,因为它匹配任何东西:因为它是一个永远不会匹配失败的模式。你也可以用 _ 或 batman 代替 otherwise。
-
@amalloy,啊,我忽略了问题中的 otherwise 。