Почему этот фолд неверен? - PullRequest
3 голосов
/ 18 мая 2011

Я читаю Программирование в Scala, и не понимаю, почему эта операция сворачивания неверна:

val fruit = List("apples", "oranges", "lemons")
println( (0/:fruit)(_.length+_.length) )

Я также пробовал с пустой строкой "" в качестве начального значения - но это не такскомпилируйте либо:

println( (""/:fruit)(_.length+_.length) )

Ответы [ 3 ]

8 голосов
/ 18 мая 2011

Попробуйте это:

println( (0 /: fruit)(_ + _.length) )

Переданная функция получает в качестве аргумента сначала аккумулятор (Int, исходя из исходного значения 0), а затем следующий элемент коллекции (aString, выведено из типа fruit).

Порядок аргументов легко запомнить, поскольку они соответствуют порядку, в котором появляются начальное значение и коллекция.Здесь начальное значение появляется первым, и, соответственно, аккумулятор передается в качестве первого аргумента - и в качестве второго аргумента вы получаете элемент коллекции fruit, который появляется после имени метода /:.

Если вместо этого вы сделали foldRight, то порядок будет удобно поменять местами:

println( (fruit :\ 0)(_.length + _) )
6 голосов
/ 18 мая 2011
println( (0 /: fruit)(_ + _.length) )

Функция для передачи в сгиб принимает функцию двух аргументов (acc, elem), где acc - аккумулятор и имеет тот же тип, что и начальное число 0, elem имеет тот же тип, что и элементы список.

Может быть понятнее, если вы используете:

(0 /: fruit){ (acc, elem) => acc + elem.length }

(редактировать: я первоначально сказал кортеж, я изменил на функцию двух аргументов)

3 голосов
/ 18 мая 2011

foldLeft (или / :) принимает (как второй аргумент) функцию, которая принимает два аргумента: аккумулятор и переменную типа членов списка.

Итак, нужно получить:

(0/:fruit)((acc:Int,el:String) => acc + el.length)

то есть

(0/:fruit)(_ + _.length)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...