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

时间:2015-12-23 15:24:19

标签: haskell pattern-matching

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

test :: Integer -> Integer -> String
test num1 num2 = case num1 of
                    num2 -> "foo"
                    otherwise -> "bar"

当我在解释器中加载它时,它警告我重叠模式匹配。此外,任何两个整数test a ba的{​​{1}}都会返回b,无论它们是否相等。看起来模式匹配中的"foo"与参数中的num2不同。

我想知道为什么会发生这种情况。我真的很感激任何有关情况的见解。

1 个答案:

答案 0 :(得分:2)

num2是一个匹配任何值的模式。总是。它与范围内的现有变量num2无关。 (在案例替代的右侧,此处为"foo",匹配的值将绑定到名称num2,隐藏现有名称num2。但此处不相关你还是不要使用num2。)

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

同样,otherwise是一种匹配所有内容的模式,与顶级值otherwise无关。 otherwise应该用于像| otherwise = ...这样的守卫;它的定义是otherwise = True

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

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