我遇到过一种情况,我希望对运营商进行模式匹配。但是,这会导致GHC出现Pattern match(es) are overlapped
错误。我无法弄清楚为什么。不允许运营商进行模式匹配吗?我假设因为在括号converts it into an identifier中包含一个运算符符号,这应该有效。
test :: (Integer -> Integer -> Integer) -> String
test (+) = "plus"
test (-) = "minus"
test _ = "other"
还有其他方法可以完成我想做的事情。我只是好奇为什么这不起作用。
答案 0 :(得分:12)
(+)
和(-)
不是Integer -> Integer -> Integer
类型的构造函数:
Integer -> Integer -> Integer
不是代数数据类型因此,您的代码等同于使用任何其他变量名来绑定第一个参数,例如
test foo = "plus"
test bar = "minus"
test _ = "other"
希望能够清楚地表明所有三种模式实际上都匹配任何东西(前两种模式绑定了一些名称)。换句话说,第一个模式(在您的示例中为foo
或(+)
)无法通过,这就是为什么它与剩余的两个重叠。