Нотация суммирования в Haskell

Eric Sink ПРАКТИЧЕСКОЕ РУКОВОДСТВО Управления исходным кодом .

Read это, затем загрузите (бесплатную) Подрывную деятельность или Хранилище (свободный для отдельного пользователя) и начните играть вокруг с ним.

6
задан ire_and_curses 27 August 2009 в 06:55
поделиться

6 ответов

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

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

Здесь '

11
ответ дан 8 December 2019 в 13:47
поделиться

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

sum l = foldl (+) 0 l

Что может быть сокращено до:

sum = foldl (+) 0
3
ответ дан 8 December 2019 в 13:47
поделиться

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

2
ответ дан 8 December 2019 в 13:47
поделиться

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

1
ответ дан 8 December 2019 в 13:47
поделиться

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

0
ответ дан 8 December 2019 в 13:47
поделиться

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

0
ответ дан 8 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: