模式匹配重叠 - 运算符上的模式匹配

时间:2014-07-15 07:37:11

标签: haskell pattern-matching

我遇到过一种情况,我希望对运营商进行模式匹配。但是,这会导致GHC出现Pattern match(es) are overlapped错误。我无法弄清楚为什么。不允许运营商进行模式匹配吗?我假设因为在括号converts it into an identifier中包含一个运算符符号,这应该有效。

test :: (Integer -> Integer -> Integer) -> String
test (+) = "plus"
test (-) = "minus"
test _ = "other"

还有其他方法可以完成我想做的事情。我只是好奇为什么这不起作用。

1 个答案:

答案 0 :(得分:12)

(+)(-)不是Integer -> Integer -> Integer类型的构造函数:

  • 它们不是构造函数名称
  • Integer -> Integer -> Integer不是代数数据类型

因此,您的代码等同于使用任何其他变量名来绑定第一个参数,例如

test foo = "plus"
test bar = "minus"
test _   = "other"

希望能够清楚地表明所有三种模式实际上都匹配任何东西(前两种模式绑定了一些名称)。换句话说,第一个模式(在您的示例中为foo(+))无法通过,这就是为什么它与剩余的两个重叠。