2013-03-13 6 views
24

У меня есть ассоциативная операция >>. Проблема в том, что его стоимость линейно зависит от размера его левого операнда. Таким образом, выражение, составленная последовательностью n применений >> какКак создать право-ассоциативный оператор инфикса?

a >> a >> a >> a >> a >> ... >> a 

имеет квадратную стоимость с точкой зрения n, так как по умолчанию операторы инфиксных являются left-associative. Как сделать его право-ассоциативным, чтобы стоимость такого выражения поддерживалась линейной с точки зрения n?

+0

Я знаю, что автоответчик рекомендуется в целом. Применяется ли это также для публикации как вопроса, так и ответа в одно и то же время? Я собирался опубликовать ответ, но, поскольку у вас был лучший ответ, это было пустой тратой времени. И ваш вопрос и ответ очень хорошо написаны, но это как-то оставляет впечатление превращения известного факта в репутацию? Тем не менее, фраза * мне понадобилось некоторое время, чтобы понять ... * добавляет приятное прикосновение иронии :). – bluenote10

+2

@ bluenote10 Я искал SO, не получив ответа, поэтому решил написать вопрос. Я его почти подготовил, но я колебался и пытался найти немного больше, чтобы попытаться найти решение. Я нашел некоторое замечание об использовании ':', и я в конце концов нашел решение в справочной системе Scala и сделал это для моего дела. Было немного отбросить вопрос и не делиться результатами, поэтому я опубликовал оба (в то же время). –

+0

Я полностью согласен с вами в том, что он добавляет ценность SO (поддерживаются оба). Я просто хотел узнать, официально ли это поощряется, поскольку это может быть немного раздражающим для пользователей, предполагая, что OP действительно ищет ответ. Не было получено никакой официальной информации. – bluenote10

ответ

42

A нашел решение. Scala ссылка говорит в 6.12.3 Инфиксных операций:

ассоциативности оператора определяется последним символом оператора. Операторы , заканчивающиеся на двоеточие ':', являются право-ассоциативными. Все остальные операторы лево-ассоциативны.

Поэтому было достаточно переименовать >> в >>:.

Потребовалось некоторое время, чтобы понять, что в то время как a >> b является обессахаренная в a.>>(b), a >>: b является обессахаренная в b.>>:(a). Поэтому я должен был определить >>: как

def >>:(x: T): T = x >> this 

 Смежные вопросы

  • Нет связанных вопросов^_^