【发布时间】: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
找到了这个部分
涉及中缀运算符的表达式由 运营商的固定性(见第 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 报告,现在很清楚了。