Eric Sink ПРАКТИЧЕСКОЕ РУКОВОДСТВО Управления исходным кодом .
Read это, затем загрузите (бесплатную) Подрывную деятельность или Хранилище (свободный для отдельного пользователя) и начните играть вокруг с ним.
foldl
- это общая хвостовая рекурсивная функция сокращения. Рекурсия - это обычный способ мышления о манипулировании списками элементов в языках функционального программирования, который предоставляет альтернативу итерации цикла, которая зачастую гораздо более элегантна. В случае функции сокращения, такой как fold
, хвостовая рекурсивная реализация очень эффективна . Как объясняли другие, сумма
тогда просто удобная мнемоника для foldl (+) 0 l
.
Предположительно, его использование на странице википедии для иллюстрации общего принципа суммирования через хвостовую рекурсию. Но поскольку библиотека Haskell Prelude содержит sum
, что короче и понятнее для понимания, вы должны использовать это в своем коде.
Здесь '
Я не вижу, где говорится что-либо о Haskell или foldl
на той странице в Википедии, но сумма
в Haskell это просто более частный случай foldl
. Это может быть реализовано, например, так:
sum l = foldl (+) 0 l
Что может быть сокращено до:
sum = foldl (+) 0
Следует отметить, что сумма может быть более ленивой, чем вам хотелось бы, поэтому подумайте об использовании foldl '.
Как заявили другие, разницы нет. Однако сумма-колл легче читать, чем фолд-колл, поэтому я бы выбрал сумму, если вам нужно суммирование.
Нет никакой разницы. На этой странице просто говорится, что сумма
реализована с использованием foldl
. Просто используйте sum
всякий раз, когда вам нужно вычислить сумму списка чисел.
Концепция суммирования может быть распространена на нечисловые типы: все, что вам нужно, это что-то эквивалентное операции (+) и нулевому значению. Другими словами, вам нужен моноид . Это приводит к функции Haskell "mconcat", которая возвращает сумму списка значений типа моноид. По умолчанию "mconcat", конечно, определяется в терминах "mappend", которая является плюсовой операцией.