我有一个关联操作>>
。问题是它的成本线性地取决于它的左操作数的大小。因此,由类似的一系列n
应用形成的表达式>>
a >> a >> a >> a >> a >> ... >> a
它在 方面具有二次成本n
,因为默认情况下中缀运算符是左关联的。如何使其具有右关联性,以使这种表达式的成本保持线性关系n
?
我有一个关联操作>>
。问题是它的成本线性地取决于它的左操作数的大小。因此,由类似的一系列n
应用形成的表达式>>
a >> a >> a >> a >> a >> ... >> a
它在 方面具有二次成本n
,因为默认情况下中缀运算符是左关联的。如何使其具有右关联性,以使这种表达式的成本保持线性关系n
?
我找到了解决方案。Scala参考在第6.12.3 节中缀操作中说:
运算符的关联性由运算符的最后一个字符决定。以冒号 ':' 结尾的运算符是右结合的。所有其他运算符都是左结合的。
因此重命名>>
为>>:
.
我花了一些时间才意识到,虽然a >> b
是脱糖成的a.>>(b)
,但a >>: b
也是脱糖成的b.>>:(a)
。所以我不得不定义>>:
为
def >>:(x: T): T = x >> this