voglio definire una funzione che calcola il numero di elementi in una lista che soddisfano una determinata predicato:numero di elementi in Haskell in stile pointfree
number_of_elements :: (a -> Bool) -> [a] -> Int
number_of_elements f xs = length (filter f xs)
Ad esempio:
number_of_elements (==2) [2,1,54,1,2]
dovrebbe ritorno .
Possiamo scrivere più breve:
number_of_elements f = length . filter f
E 'possibile scrivere senza f parametro?
ciò che stai cercando è chiamato "stile Pointfree". C'è una wiki al riguardo qui: http://www.haskell.org/haskellwiki/Pointfree. Ti insegna tutti i trucchi come il gufo: '((.) $ (.))' E il punto: '((.). (.))'. Tuttavia non consiglierei personalmente questo stile. –
Consiglierei di giocarci un po ', per vedere come funziona, ma usando lo stile parzialmente ininterrotto 'number_of_elements f = length. filtro f'. Di solito è il più leggibile. –
Questa è una funzione che raramente mi proverò a definire, perché 'length (filter f xs)' è, francamente, più facile da leggere di 'number_of_elements f xs'. Quest'ultimo mi richiede di capire cosa fa la tua funzione cercando la definizione della tua funzione, la documentazione o dedurla dal tipo; mentre il primo è un semplice uso combinato di due funzioni che comprendo già - ed è anche più breve da scrivere! Definirei questa funzione solo come una funzione ausiliaria in una funzione 'where' binding, o come una funzione non esportata, e anche in questo caso solo se sarà argomento di altre funzioni. –