How to make a right-associative infix operator?

2019-01-17 10:40发布

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?

1条回答
对你真心纯属浪费
2楼-- · 2019-01-17 11:14

A found a solution. Scala reference says in 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
查看更多
登录 后发表回答