Работая над Learn You a Haskell For Great Good, в главе о функциях высшего порядка автор рассматривает реализацию нескольких различных библиотечных функций. Когда я пришел к определению filter'
(повторная реализация стандартной библиотечной функции filter
), я подумал, что очевидным было следующее:
filter' f xs = [x | x <- xs, f x]
Но автор дает следующее более длинное рекурсивное определение:
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
Оба определения делают одно и то же. Есть ли для этого причина? Является ли рекурсивное определение более эффективным? Это более идиоматично для Haskell? Что-то другое?
filter'
также можно записать в терминах функции высшего порядкаfoldr
, как вfilter' p = foldr (\x ys -> if p x then x : ys else ys) []
, хотя это был бы лучший пример использования функции высшего порядка, чем создание ее с нуля. - person hammar   schedule 09.07.2011