Почему сложение имеет следующий тип в Scala? - PullRequest
5 голосов
/ 09 августа 2011

Я смотрел, как складывается определение для неизменяемого. Набор:

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1 

все же foldLeft определяется как:

def foldLeft [B] (z: B)(op: (B, A) ⇒ B): B 

Это выглядит странно для меня, по крайней мере, на первый взгляд, поскольку я ожидал, что fold сможет изменить тип возвращаемой коллекции, так же, как это делает foldLeft.

Я полагаю, это потому, что foldLeft и foldRight гарантируют что-то о порядке, в котором элементы складываются. Какую гарантию дает фолд?

Ответы [ 2 ]

6 голосов
/ 10 августа 2011

Когда вы применяете foldLeft, тогда ваше начальное значение объединяется с первым элементом списка.Результат объединяется со вторым элементом списка.Этот результат с третьего и так далее.В конце концов, список свернулся до одного элемента того же типа, что и начальное значение.Поэтому вам просто нужен какой-то тип, который может быть объединен вашей функцией с элементом списка.
Для foldRight применяется то же самое, но в обратном порядке.

fold не гарантирует порядок скомбинации сделаны.И это не гарантирует, что он начинается только с одной позиции.Складки могут происходить параллельно.Поскольку у вас может быть параллелизм, требуется, чтобы любые 2 элемента списка или возвращаемые значения могли быть объединены - это добавляет ограничение к типам.

Что касается вашего комментария о том, что вы должны увидеть случай, когда порядок влияетПредположим, что вы используете сгибы для объединения списка символов и хотите, чтобы в результате вы получили текст.Если вы вводите A, B, C, вы, вероятно, хотели бы сохранить порядок для получения ABC вместо ACB (например).
С другой стороны, если вы, скажем, просто складываете числа,порядок не имеет значения.Суммирование 1, 2, 3 дает 6 независимо от порядка сложений.В таких случаях использование fold вместо foldLeft или foldRight может привести к более быстрому выполнению.

0 голосов
/ 10 августа 2011

Кажется, что FoldLeft должен вернуть B. Метод принимает B arg - это аккумулятор.Значения A используются, чтобы «добавить больше» в B. Возвращается окончательное накопленное значение.Я думаю, что FoldLeft и FoldRight одинаковы в этом отношении.

...