How to make a right-associative infix operator?
associative, infix-notation, scala
Solution
I found a solution. Scala reference says in section 6.12.3 Infix Operations:
The associativity of an operator is determined by the operator’s last character. Operators ending in a colon ‘:’ are right-associative. All other operators are left-associative.
Therefore it was enough to rename `>>` to `>>:`.
It took me some time to realize that while `a >> b` is desugared into `a.>>(b)`, `a >>: b` is desugared into `b.>>:(a)`. So I had to define `>>:` as
def >>:(x: T): T = x >> this
Problem
I have an associative operation `>>`. The problem is that its cost linearly depends on the size of its left operand. So an expression formed by a sequence of `n` applications of `>>` like ``` a >> a >> a >> a >> a >> ... >> a ``` it has quadratic cost in terms of `n`, because by default infix operators are left-associative. How to make it right-associative so that the cost of such an expression is kept linear in terms of `n`?