consideri il description of filter
in the docs:
filter
, applicato ad un predicato e una lista, restituisce la lista di quegli elementi che soddisfano il predicato; cioè,
filter p xs = [x | x <- xs, p x]
di spiegarlo a qualcuno che non capisce list comprehension, si potrebbe dire filter
ha tre casi:
- (il caso facile) quando la lista per essere filtrato è vuota, il risultato è vuoto
- quando la testa della lista da filtrare soddisfa il predicato, è parte del risultato
- altrimenti, salta la testa e filtra il resto della lista
Questi casi corrispondono uno a uno con le ultime tre righe della definizione nella tua domanda.
Piccoli tocchi possono rendere la definizione più idiomatica e quindi più facile da leggere:
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
Per un elenco vuoto, il predicato può essere qualsiasi cosa a tutti, e la sottolineatura indica esplicitamente che è poco importante in questo caso.
Piuttosto che la corrispondenza con (x:y)
, utilizzando (x:xs)
-Pensate: "ex e exes" -emphasizes che si sta separando una lista nella sua testa (di tipo a
) e la coda (di tipo [a]
, cioè, elenco delle a
).
Infine, allineando le chiamate ricorsive a filter
permette facilmente al lettore di vedere che quest'ultimo caso omette x
.
fonte
2010-04-02 18:23:33
@Justice: mi chiedo se il reformat è valido.Forse OP era davvero confuso dallo strano layout? – kennytm