2017-02-16 2 views
1

Основываясь на объяснении и моем понимании операции добавления списка в scala, оно является правильным ассоциативным. Так что дано заявление List1 ::: List2 - не что иное, как List2.:::List1. При этом сказал, что я пытался сделать следующие операцииScala List append operation - требуется объяснение

val list1 = List(1,2,3,4); val list2 = List(5,6,7,8) ; list1 ::: list2 // this is good 

list2.::: list1 //ERROR - Not applicable to List[B]code here

Почему не вторая операция добавления компиляции?

+4

Вам не хватает скобки. Попробуйте 'list2. :: :(list1)'. – marstran

+0

, который сработал. Но какой трюк сделал этот дополнительный()? Как это помогает компилятору понять утверждение? – Gurupraveen

+1

'list2. ::: list1' недействителен Синтаксис Scala. Вы должны либо использовать скобку (например, 'list2. :: :(list1)'), либо использовать нотацию infix, как вы это делали раньше (например, 'list1 ::: list2'). С помощью этой конкретной функции нотация infix имеет «list1», написанную первой, потому что функция является правильной ассоциативной. Функции с именем, заканчивающимся двоеточием, являются правильными ассоциативными в Scala. – marstran

ответ

1

Причина, по которой он не компилируется, состоит в том, что там есть микс и математика с синтаксисом. вы можете использовать обычный синтаксис для вызова метода:

list2.:::(list1)

Обратите внимание на точке и скобку.

Или вы можете использовать инфиксные обозначения для вызова методов арности-1:

list1 ::: list2

Но вы не можете смешивать между ними.

Оператор ::: фактически является оператором prepend, а не append, работает на list2 (как вы правильно указали, он является правильным ассоциативным) и добавляет элементы list1 перед ним.

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