【问题标题】:Pattern Match(es) are Overlapped - Pattern matching on OperatorsPattern Match(es) are Overlapped - 运算符的模式匹配
【发布时间】:2014-07-15 07:37:11
【问题描述】:

我遇到了一种情况,我想对运算符进行模式匹配。但是,这会在 GHC 中引发 Pattern match(es) are overlapped 错误。我不知道为什么。不允许对运算符进行模式匹配吗?我假设由于将运算符符号括在括号 converts it into an identifier 中,这应该可以工作。

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

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

【问题讨论】:

  • 您的第一行匹配任何函数并将其本地绑定到中缀运算符 +。因此,后续行超出了要求,因此发出警告。请注意,函数符号,无论是否中缀,都可以通过这种方式通过模式匹配在本地反弹。只有大写的构造函数(或:前缀的中缀构造函数)和文字只匹配它们自己,然后只匹配一阶类型。 Haskell(几乎)没有办法检查函数的内涵属性:(除了seq)你只能通过应用它们来利用它们的外延属性。 “这是+功能吗?”不允许。
  • @pigworker,这解释了为什么我收到“此绑定掩盖了现有的前奏定义”消息。谢谢你的信息。

标签: haskell pattern-matching


【解决方案1】:

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

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

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

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

希望这可以清楚地表明所有三种模式实际上都匹配任何东西(并且前两种模式绑定了一些名称)。换句话说,第一个模式(foo,或您的示例中的(+))没有办法通过,这就是它与其余两个重叠的原因。

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多