在Haskell中,以下工作:
> (+) `liftM` (Just 3) `ap` (Just 5)
Just 8
Frege提示使用parantheses:
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”,必须加上括号 当i = j时,“x qop(a,i)y”或“y qop(b,j)z”,除非a = b = 1或 A = B = R
在上面的代码中,两个“运算符”都没有关联性,并且具有相同的默认优先级,因此看起来Frege的行为与Haskell报告一致。
我理解这是对的吗?为什么弗雷格在这种情况下需要括号而Haskell能够消除歧义?或者在这种情况下Haskell如何能够消除歧义?
答案 0 :(得分:2)
嗯,这是因为,就目前而言,`foo`
默认为非关联性在弗雷格,而在Haskell中它是左关联性。
这应该在Frege编译器中得到纠正,以使其与Haskell兼容。