Почему некоторые функции Prelude определены в терминах foldl?

В общем-то, foldl избегается в пользу foldl' или же foldr, Цитирую реальный мир на Haskell:

Из-за громкого поведения foldl целесообразно избегать этой функции в реальных программах: даже если она не дает сбоя сразу, она будет излишне неэффективной. Вместо этого импортируйте Data.List и используйте foldl'.

Тем не менее, некоторые функции Prelude определены в терминах этого (например, (\\) а также unionBy). Почему это? Разве это не слишком строгая строгость к этим функциям?

3 ответа

Решение

Прелюдия была разработана раньше foldl' существовал, и с тех пор было давление для поддержания обратной совместимости (в отношении строгости, как вы упоминали).

В случае (\\) а также unionByСложенная функция имеет тип

foo :: [a] -> b -> [a]

а также foo xs y удаляет максимум один элемент из xsтак что используя foldl' не купил бы там вообще ничего, сундуки построили бы справа от самого верха (:) а не выше этого тогда.

С точки зрения строгости это не будет иметь значения, насколько я вижу, обе складки будут оцениваться только тогда, когда необходимо оценить результат до нормальной формы слабой головы, и всякий раз, когда foldl' будет производить _|_так бы foldl,

В обоих случаях аккумулятор имеет тип [a], Я не вижу, чтобы приведение списка в нормальную форму со слабой головой имело бы огромное значение, и введение такой частичной строгости кажется несколько произвольным.

Другие вопросы по тегам