为了使左结合运算符变为右结合运算符,实现中需要更改什么?
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级)。
我正在阅读 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级)。