我注意到尝试在haskell中使用参数执行模式匹配并不总是有效。这是一个例子:
test :: Integer -> Integer -> String
test num1 num2 = case num1 of
num2 -> "foo"
otherwise -> "bar"
当我在解释器中加载它时,它警告我重叠模式匹配。此外,任何两个整数test a b
和a
的{{1}}都会返回b
,无论它们是否相等。看起来模式匹配中的"foo"
与参数中的num2
不同。
我想知道为什么会发生这种情况。我真的很感激任何有关情况的见解。
答案 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"