Trabajando con Aprenda un Haskell para Great Good, en el capítulo sobre funciones de orden superior, el autor realiza una implementación de algunas funciones de biblioteca diferentes. Al llegar a la definición de filter'
(una reimplementación de la función de la biblioteca estándar filter
), pensé que la cosa obvia era la siguiente:Recursión o comprensión de la lista?
filter' f xs = [x | x <- xs, f x]
Sin embargo, el autor da el siguiente largo, definición recursiva:
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
Ambas definiciones hacen lo mismo. Hay alguna razón para esto? ¿Es la definición recursiva de alguna manera más efectiva? ¿Es más idiomático para Haskell? ¿Algo más?
'filter'' también se puede escribir en términos de la función de orden superior' foldr' como en 'filter 'p = foldr (\ x ys -> si px luego x: ys else ys) []', aunque ese sería un mejor ejemplo de un uso de una función de orden superior que cómo construir uno "desde cero". – hammar
Ver [Haskell 2010> Expresiones> Lista de comprensiones] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-420003.11) si le interesa cómo desugar. –