Currying e applicazione parziale di funzioni
In C# siamo abituati a definire ed utilizzare funzioni che hanno parametri multipli in ingresso, ad esempio l'addizione. Se per qualche motivo volessimo o avessimo solamente funzioni che prendono in input un unico parametro potremmo comunque rappresentare ed utilizzare le funzioni che oggi definiamo con più parametri?
La risposta è sì e questo procedimento di riduzione delle funzioni ad un singolo input si chiama "currying". Nel mondo Microsoft il linguaggio F# fa in maniera automatica questa operazioni ogni qual volta definiamo una funzione.
L'operazione che viene effettuata è quella di considerare una funzione di n parametri come la composizione di n funzioni di un parametro.
Vediamo come viene definita l'addizione nella console interattiva F# di VS, il tipo che viene dedotto è int -> int -> int che indica una funzione che dato un intero restituisce un'altra funzione che accetta a sua volta un parametro intero e restituisce un intero.
Un esempio per chiarire le idee:
La funzione add come abbiamo detto è una funzione di un parametro che restituisce una funzione. Infatti passando il valore 2 alla funzione add otteniamo una nuova funzione, che abbiamo chiamato add2, che calcoliamo nuovamente passando 5 e ottenendo il risultato atteso 7.
Il currying ci ha permesso di "applicare parzialmente" la funzione add, ovvero passare solo una parte degli argomenti necessari all'effettivo calcolo ed ottenere delle funzioni intermedie potenzialmente riutilizzabili.
Ma in C# tutto questo è possibile? Sì ma non in maniera così automatica. Definendo add nelle due modalità seguenti
Certamente non riusciamo ad applicare la funzione add o Add con un unico parametro. Possiamo però imitare F# e definire una funzione di un intero che restituisce una funzione
In questo modo abbiamo eseguito il currying manuale della funzione add e ottenuto quello che volevamo. Ovviamente si può pensare a dei metodi generici che effettuino il currying o l'applicazione parziale su una qualunque funzione.