Почему некоторые функции 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]
, Я не вижу, чтобы приведение списка в нормальную форму со слабой головой имело бы огромное значение, и введение такой частичной строгости кажется несколько произвольным.