我有一个关联操作>>
。问题是它的成本线性地取决于其左操作数的大小。因此,由n
>>
类似
a >> a >> a >> a >> a >> ... >> a
个应用程序序列形成的表达式
n
它在n
方面具有二次成本,因为默认中缀运算符为left-associative。如何使它成为右关联,以便这种表达式的成本在{{1}}方面保持线性?
答案 0 :(得分:48)
找到了解决方案。 Scala引用在 6.12.3中缀操作:
中说明运算符的关联性由运算符的最后一个字符决定。运营商 以冒号':'结尾是右关联的。所有其他运算符都是左关联的。
因此将>>
重命名为>>:
就足够了。
我花了一些时间才意识到,当a >> b
被a.>>(b)
移除时,a >>: b
被移植到b.>>:(a)
中。所以我必须将>>:
定义为
def >>:(x: T): T = x >> this