2012-11-20 3 views
8

В целом, foldl исключается в пользу foldl' или foldr. Цитирование Real World Haskell:Почему некоторые функции Prelude определены в терминах foldl?

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

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

+0

Примечание: анализ строгой шкалы в GHC означает, что 'foldl' работает лучше, чем вы могли бы подумать удивительно часто. – singpolyma

+0

Строго говоря, '(\\)' и 'unionBy' не находятся в Prelude. – sdcvvc

ответ

13

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

+0

Это интересно. Так и совет, не используя 'foldl' распространяется? Я имею в виду, следует ли нам избегать '(\\)' и 'unionBy' тоже? – Tarrasch

+0

@Tarrasch Часто, да, особенно с числовыми сгибами. Это обычное явление для реализации 'sum '= foldl' (+) 0' и таких вещей в каждом проекте, который им нужен. –

+0

@ DanielWagner: на самом деле 'sum' не определен в терминах' foldl', кроме 'USE_REPORT_PRELUDE': http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/src /Data-List.html#sum – amindfv

4

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

10

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

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

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

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

Смежные вопросы