2013-09-17 3 views
0

Зачем вводить (1 :: xs)? Один из них стоит на начало списка xs.Как понять функцию reduceLeft?

So List(3,2,1) становится List(1,3,2,1), но что такое значение (1 :: xs)?

У меня возникли проблемы с пониманием, как это работает:

def product(xs : List[Int]) = (1 :: xs) reduceLeft((x , y) => x * y) 

В подписи метода префикс операнда (в данном случае (1 :: xs)) не описано? :

def reduceLeft[B >: A](f: (B, A) => B): B = 

ответ

2

(1 :: xs) не является префиксом операнд.

Вы фактически добавляете 1 перед своим списком xs.

So product(List(3,2,1)) будет List(1,3,2,1) reduceLeft((x,y) => x * y).

Функция reduceLeft примет 2 элемента слева и заменит результат вашей функции (x,y) => x * y.

В вашем случае

Список (1,3,2,1) => принимает (1,3) и заменяет на 1 * 3 = 3 новый список: List (3,2,1)
Список (3,2,1) => принимает (3,2) и заменяет на 3 * 2 = 6 новый Список: (6,1)
И наконец, берет (6,1) и получает окончательный результат 6.

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

Удалите это и попробуйте product(List()), и вы увидите. Если Список имеет хотя бы элемент (1 :: xs), не будет иметь эффекта в вашей функции

0

Я считаю, что вы понимаете, что все в порядке. (1 :: xs) - это просто еще один способ выразить List(1,3,2,1), на котором затем вызывается reduceLeft.

Что касается лучшего понимания reduceLeft, я недавно blogged this exact topic.

0

Это не префиксный операнд - это method invocation экземпляра списка. Метод reduceLeft вызывается в списке (1 :: xs).

(1 :: xs) reduceLeft((x , y) => x * y) 

также можно записать в виде

(1 :: xs).reduceLeft((x , y) => x * y) 

Или, еще более явно:

val myList = (1 :: xs) 
myList.reduceLeft((x , y) => x * y) 
Смежные вопросы