Considere el description of filter
in the docs:
filter
, aplicado a un predicado y una lista, devuelve la lista de aquellos elementos que satisfacen el predicado; es decir,
filter p xs = [x | x <- xs, p x]
explicarlo a alguien que no entiende las listas por comprensión, se podría decir filter
tiene tres casos:
- (El caso fácil) cuando la lista sea filtrado está vacío, el resultado también está vacío
- cuando el encabezado de la lista a filtrar satisface el predicado, es parte del resultado
- de lo contrario, omita la cabecera y filtre el resto de la lista
Estos casos corresponden uno a uno con las últimas tres líneas de la definición en su pregunta.
Los pequeños detalles pueden hacer que la definición más idiomática y por lo tanto más fácil de leer:
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
Para una lista vacía, el predicado puede ser nada en absoluto, y el subrayado indica explícitamente que no es importante en este caso.
En lugar de juego contra (x:y)
, utilizando (x:xs)
-Piense: "ex y exes" -emphasizes que estás separar una lista en su cabeza (de tipo a
) y la cola (de tipo [a]
, es decir, lista de a
).
Por último, alinear las llamadas recursivas a filter
permite fácilmente al lector ver que este último caso omite x
.
@Justice: Me pregunto si el reformateo es válido.¿Tal vez OP estaba realmente confundido por el extraño diseño? – kennytm