为了使左结合运算符变为右结合运算符,实现中需要更改什么?

What in the implementation needs to change in order for a left associative operator to become right associative?

我正在阅读 Haskell,正如预期的那样,有些运算符是左结合的,有些是右结合的。这让我开始思考,在比较左结合版本与右结合版本时,新运算符 ¤ 的实现会有何不同?

那么给定 [1,2] ¤ [3,4] ¤ [5,6],如果我希望将其解释为 (([1,2] ¤ [3,4]) ¤ [5,6]) 而不是 ([1,2] ¤ ([3,4] ¤ [5,6])),那么实现有哪些变化?

要说明运算符是左结合还是右结合,可以使用 fixity declaration.

例如

infixl 5 .+.                  -- left associative
infixr 5 .-.                  -- right associative
infix  5 .=.                  -- not associative

最后一个导致x .=. y .=. z解析错误,需要显式括号。

上面的数字5是优先级,应该按照其他运算符的级别来选择(例如(+)是6级,而($)是0级)。