【问题标题】:How to make a right-associative infix operator?如何制作右结合中缀运算符?
【发布时间】:2013-03-01 08:30:02
【问题描述】:
我有一个关联操作>>。问题是它的成本线性地取决于它的左操作数的大小。所以由>>的一系列n应用形成的表达式就像
a >> a >> a >> a >> a >> ... >> a
它在n 方面具有二次成本,因为默认情况下中缀运算符是left-associative。如何使其具有右关联性,以使此类表达式的成本在 n 方面保持线性?
【问题讨论】:
标签:
scala
associative
infix-notation
【解决方案1】:
我找到了解决方案。 Scala reference 在 6.12.3 中缀操作部分中说:
运算符的关联性由运算符的最后一个字符决定。运营商
以冒号“:”结尾的是右结合的。所有其他运算符都是左结合的。
因此,将 >> 重命名为 >>: 就足够了。
我花了一些时间才意识到,a >> b 被脱糖成 a.>>(b),a >>: b 被脱糖成 b.>>:(a)。所以我不得不将>>: 定义为
def >>:(x: T): T = x >> this