2011-07-09 38 views
9

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?

+1

'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

+0

Ver [Haskell 2010> Expresiones> Lista de comprensiones] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-420003.11) si le interesa cómo desugar. –

Respuesta

13

Probablemente sea porque la comprensión de la lista es solo azúcar sintáctica, que en principio se traduce a la forma recursiva.

Si los autores apuntan a ilustrar cómo se implementa la función, usar un atajo de comprensión de lista realmente no hace eso; muestra una forma alternativa de expresar la solución, pero no es realmente una implementación funcional.

En resumen, muestra cómo implementar desde un conjunto bastante básico de bloques de construcción básicos.

Esto es una suposición, sin embargo, no he leído ese tutorial yo mismo.

8

La comprensión de la lista es más o menos azúcar para un mapa y un filtro en una sola operación; Aunque puede usar concatMap en el back-end. En general, usar algo de mayor abstracción para implementar algo de baja abstracción es hacer trampa.

+0

No puede implementar listas de comprensión en términos de solo mapas y filtros, realmente necesita concatMap. – augustss

+1

@augustss ¿Por qué crees que mencioné específicamente que usa concatMap? Y a lo que me refería es que el filtro es básicamente parte de concatMap. – alternative

+0

"puede usar" no sonaba como "debe usar". :) – augustss