使用括号消除歧义,例如`liftM b ap c`

时间:2016-01-07 05:27:51

标签: haskell frege

在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如何能够消除歧义?

1 个答案:

答案 0 :(得分:2)

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

这应该在Frege编译器中得到纠正,以使其与Haskell兼容。