Quali sono i vantaggi del currying nella programmazione funzionale?
Un vantaggio è la facile applicazione parziale di una funzione.
In Haskell, tutte le funzioni sono curry di default. So the filter function, which applies a predicate to a list and keeps the elements which match, if called like this…
- filter odd [1,2,3]
will return [1,3] . But this…
- onlyOdds = filter odd
creates a function onlyOdds which, applied to any list of numbers, will throw away the even elements.
In languages which don’t curry all functions, partial application is the benefit of currying.
Another benefit - in functional programming - is that it can (and does, for Haskell) simplify the syntax. Come mostrato nell'esempio sopra, Haskell non ha bisogno di una sintassi speciale di applicazione parziale e ha molto meno bisogno di parentesi. Poiché, in un linguaggio puramente funzionale, tutto è fatto dalla creazione di funzioni specializzate da quelle generali e dall'applicazione delle funzioni risultanti in sequenza, questo risparmia un sacco di battitura
Un altro esempio di semplificazione:
- map (filter odd) [[1,2,3],[2,4,8],[9,8,7]]
Che applica "filtrare i numeri pari" ad ogni lista in una lista di liste. Anche se Haskell ha una sintassi per le lambda, non ho dovuto usarla. Mettere l'applicazione parziale dentro le parentesi non è una sintassi speciale. È la stessa sintassi usata per qualsiasi sottoespressione che ha bisogno di essere trattata dall'espressione padre come un singolo valore.
Questi sono i benefici più immediatamente evidenti per l'utente. Ma semplifica anche il sistema dei tipi (tutte le funzioni prendono solo un argomento), il che va a beneficio sia dell'utente (più facile creare nuove astrazioni che si compongano bene con quelle esistenti) che del compilatore. Sotto il cofano, la semplificazione della semantica del linguaggio è un grande affare per il compilatore.
Fondamentalmente, nel Lambda Calculus tutte le funzioni sono curry. Poiché la maggior parte dei compilatori di linguaggi funzionali hanno una sequenza di stadi intermedi, ognuno dei quali trasforma l'output dello stadio precedente in un diverso raffinamento del Lambda Calculus, avere le astrazioni del linguaggio di primo livello basate anche su funzioni a singolo argomento è un vantaggio significativo.
E se sei uno sviluppatore che capisce il Lambda Calculus, ne benefici anche tu.