2013-07-20 3 views
3

Хотя тройной двоеточие является право-ассоциативным оператором, следующий результат говорит, что это неверно, не так ли?право-ассоциативный оператор тройной толстой кишки

List(3, 4, 5) ::: List(18, 19, 20) //> List[Int] = List(3, 4, 5, 18, 19, 20) 

С моей точки зрения, результат должен быть List(18, 19, 20, 3, 4, 5), так как это то же самое, как говорят:

List(18, 19, 20).:::(List(3, 4, 5)) 

ли я понимаю, определение того, чтобы быть правоассоциативной неправильно?

ответ

5

Из документов:

def :::(prefix: List[A]): List[A] 
[use case] Adds the elements of a given list in front of this list. 

Пример:

List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4) 
prefix - The list elements to prepend. 
returns - a list resulting from the concatenation of the given list prefix and this list. 

Это говорит все это. Что касается право-ассоциативных операций, то ваш право.

1

Ассоциативность не имеет значения в выражение

x ::: y 

Ассоциативность ::: определяет, является ли

x ::: y ::: z 

интерпретируется как (если левоассоциативной)

(x ::: y) ::: z 

или как (если право-ассоциативный)

Поскольку в Scala все операторы, заканчивающиеся на двоеточие, являются право-ассоциативными, используется последняя интерпретация: предполагается, что x, y, z являются переменными типа List, первая y добавляется к z, а затем x добавляется к тому, что.

+0

поэтому, 'x ::: (y ::: z)' ==> 'List (z, y, x)'? –

+0

Нет, извините - я просто использовал x, y и z для представления списков. Я обновлю ответ. – AmigoNico

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