【问题标题】:Use parentheses to disambiguate an expression like `liftM b ap c`使用括号消除表达式的歧义,例如 `liftM b ap c`
【发布时间】:2016-04-11 10:01:01
【问题描述】:

在 Haskell 中,以下工作:

> (+) `liftM` (Just 3) `ap` (Just 5)
Just 8

弗雷格使用括号的提示:

frege> (+) `liftM` (Just 3) `ap` (Just 5)
E <console>.fr:12: invalid expression, none-associative operator liftM
    found on same level as none-associative operator ap
H <console>.fr:12: Use parentheses to disambiguate an expression like a
    liftM b ap c

我在Haskell report:

找到了这个部分

涉及中缀运算符的表达式由 运营商的固定性(见第 4.4.2 节)。连续无括号 具有相同优先级的运算符必须都是左或右 关联以避免语法错误。给定一个不带括号的 表达式“x qop(a,i) y qop(b,j) z”,必须在周围加上括号 "x qop(a,i) y" 或 "y qop(b,j) z" 当 i=j 时,除非 a=b=l 或 a=b=r。

在上面的代码中,两个“运算符”都没有关联性并且具有相同的默认优先级,因此看起来 Frege 的行为与 Haskell 报告一致。

我理解对了吗?为什么在这种情况下 Frege 需要括号,而 Haskell 能够消除歧义?或者 Haskell 如何在这种情况下消除歧义?

【问题讨论】:

  • 认为这两个都应该是左关联的(通过将它们放在反引号中)所以它是((+) `liftM` (Just 3)) `ap` (Just 5) - 也许弗雷格确实看到了这一点不同
  • 似乎问题在这里得到了回答:stackoverflow.com/questions/8139066/… - 你同意吗?
  • @Carsten 谢谢!我实际上看到了这个问题,但一定忽略了我在问题中引用的内容并感到困惑,它说“给定一个未加括号的表达式......必须添加括号”。我再次检查了您链接的问题和 Haskell 报告,现在很清楚了。

标签: haskell frege


【解决方案1】:

嗯,这是因为,就目前而言,`foo` 在 Frege 中默认为非关联性,而在 Haskell 中则是左关联性。

这应该在 Frege 编译器中更正,以使其更兼容 Haskell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多