在 Haskell 中,以下工作:
> (+) `liftM` (Just 3) `ap` (Just 5)
Just 8
Frege 提示使用括号:
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 报告中找到了这一部分:
涉及中缀运算符的表达式通过运算符的固定性来消除歧义(参见第 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 在这种情况下如何消除歧义?