如何建立一个右关联中缀运算符?

Pet*_*lák 31 scala associative infix-notation

我有一个关联操作>>.问题是它的成本线性地取决于其左操作数的大小.所以由一系列类似的n应用程序形成的表达式>>

a >> a >> a >> a >> a >> ... >> a
Run Code Online (Sandbox Code Playgroud)

它具有二次成本n,因为默认中缀运算符是左关联的.如何使它成为右关联,以便这样的表达式的成本保持线性n

Pet*_*lák 53

找到了解决方案.Scala引用在6.12.3中缀操作中说:

操作员的关联性由操作员的最后一个字符决定.以冒号':'结尾的运算符是右关联的.所有其他运算符都是左关联的.

因此,重命名>>>>:.

我花了一些时间才意识到,虽然a >> b已经堕入a.>>(b),但是a >>: b被贬低了b.>>:(a).所以我不得不定义>>:

def >>:(x: T): T = x >> this
Run Code Online (Sandbox Code Playgroud)