Нотация суммирования в Haskell - PullRequest
6 голосов
/ 27 августа 2009

На странице Википедии о суммировании говорится, что эквивалентная операция в Haskell должна использовать foldl . У меня вопрос: есть ли причина, по которой он говорит использовать это вместо sum ? Один «пурист» больше, чем другой, или нет реальной разницы?

Ответы [ 6 ]

11 голосов
/ 27 августа 2009

foldl - это общая хвостовая рекурсивная функция сокращения. Рекурсия - это обычный способ управления списками элементов в функциональных языках программирования, который предоставляет альтернативу итерации цикла, которая зачастую гораздо более элегантна. В случае функции сокращения, такой как fold, хвостовая рекурсивная реализация очень эффективна . Как объяснили другие, sum - это просто удобная мнемоника для foldl (+) 0 l.

Предположительно, его использование на странице википедии служит для иллюстрации общего принципа суммирования через хвостовую рекурсию. Но поскольку библиотека Haskell Prelude содержит sum, что короче и более понятно для понимания, вы должны использовать это в своем коде.

Вот хорошее обсуждение функций Haskell fold с простыми примерами, которые стоит прочитать.

3 голосов
/ 27 августа 2009

Я не вижу, где говорится о Haskell или foldl на той странице Википедии, но sum в Haskell - это просто более конкретный случай foldl. Это может быть реализовано так, например:

sum l = foldl (+) 0 l

Что может быть уменьшено до:

sum = foldl (+) 0
2 голосов
/ 27 августа 2009

Стоит отметить, что сумма может быть ленивее, чем хотелось бы, поэтому подумайте об использовании foldl '.

1 голос
/ 27 августа 2009

Как утверждают другие, нет никакой разницы. Тем не менее, суммированный колл легче читать, чем фолд колл, поэтому я бы выбрал сумму, если вам нужно суммирование.

0 голосов
/ 30 августа 2009

Концепция суммирования может быть распространена на нечисловые типы: все, что вам нужно, это что-то эквивалентное операции (+) и нулевому значению. Другими словами, вам нужен моноид . Это приводит к функции Haskell "mconcat", которая возвращает сумму списка значений моноидного типа. Конечно, значение по умолчанию «mconcat» определяется в терминах «mappend», что является плюсовой операцией.

0 голосов
/ 27 августа 2009

Разницы нет. На этой странице просто говорится, что sum реализовано с использованием foldl. Просто используйте sum всякий раз, когда вам нужно вычислить сумму списка чисел.

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