суммирование преобразования списка чисел в Scala - PullRequest
7 голосов
/ 11 октября 2011

Мне часто нужно суммировать преобразование списка чисел в Scala. Конечно, это можно сделать следующим образом:

list.map(transform(_)).sum

Однако это создает память, когда создание памяти не требуется. Альтернатива - свернуть список.

list.foldLeft(0.0) { (total, x) => total + f(x) }

Я считаю, что первое выражение гораздо легче написать, чем второе выражение. Есть ли способ, который я могу использовать, который имеет простоту первого с эффективностью второго? Или мне лучше написать свой собственный неявный метод?

list.mapSum(transform(_))

Ответы [ 2 ]

12 голосов
/ 11 октября 2011

Вы можете использовать представление , чтобы сделать ваши методы преобразования (map, filter ...) ленивыми.См. здесь для получения дополнительной информации.

Так, например, в вашем случае метода с именем transform вы бы написали

list.view.map(transform).sum

(обратите внимание, что вы можете опционально опустить(_))

5 голосов
/ 11 октября 2011

Эта операция называется foldMap, и вы можете найти ее в Scalaz.

list foldMap transform
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...