Funzion(al)i di Ordine Superiore
Dire che una funzione è di ordine superiore (spesso chiamata funzionale) significa che essa può:
- Prendere una o più funzioni come argomento.
- Restituire una funzione come risultato.
Esempi
map: applica una funzione a ogni elemento di una lista.filter: seleziona elementi in base a un predicato (funzione booleana).foldr: generalizza i pattern di ricorsione sulle liste.(.): l’operatore di composizione funzionale, che combina due funzioni in una.
Currificazione (Currying)
La currificazione è la proprietà per cui una funzione che accetta più argomenti viene trasformata in una sequenza di funzioni che accettano un solo argomento alla volta. Si fonda su un isomorfismo matematico:
In Haskell, tutte le funzioni sono currificatate di default. Questo significa che una funzione definita come f :: a -> b -> c è in realtà una funzione che prende un tipo a e restituisce una nuova funzione di tipo b -> c.
Vatanggi
- Applicazione Parziale: Permette di passare solo alcuni degli argomenti a una funzione, ottenendo una funzione “specializzata” pronta a ricevere i parametri mancanti.
Strumenti per la Manipolazione Funzionale
Haskell fornisce funzionali predefiniti per la gestione della currificazione e delle funzioni di ordine superiore:
curry: converte una funzione che accetta una coppia in una versione currificata:((a, b) -> c) -> a -> b -> c.uncurry: l’operato opposto, trasforma una funzione currificata in una che accetta una tupla:(a -> b -> c) -> (a, b) -> c.flip: inverte l’ordine dei primi due parametri di una funzione:(a -> b -> c) -> b -> a -> c.
Eta-Regola
L’ (eta-reduction) permette di omettere un parametro se esso compare identico alla fine di entrambi i lati di un’equazione.
f x = g x
-- equivalente a:
f = g