Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Currying

Usare su Javascript il currying, tecnica di programmazione funzionale per decomporre funzioni di arietà n in sequenze di n funzioni di un solo argomento.
Usare su Javascript il currying, tecnica di programmazione funzionale per decomporre funzioni di arietà n in sequenze di n funzioni di un solo argomento.
Link copiato negli appunti

Il currying è una tecnica che consente di decomporre una funzione di arietà n in una sequenza di n funzioni di un solo argomento. Consideriamo ancora una volta la funzione somma() vista nelle lezioni precedenti per spiegare meglio il concetto:

function somma(x, y) {
   return x + y;
}

Applicando il currying otteniamo la seguente definizione:

function sommaCurried(x) {
   return function(y) {
      return x + y;
   };
}

Sfruttando le arrow function, possiamo definire la stessa funzione in maniera più compatta come mostrato di seguito:

var sommaCurried = x => y => x + y;

Indipendentemente dalla forma con cui abbiamo definito la funzione sommaCurried(), il risultato consiste in una funzione che restituisce un'altra funzione, che a sua volta restituisce il calcolo effettivo. Ciascuna delle funzioni restituite ha un solo parametro. Possiamo infatti invocare la somma di due numeri come mostrato dal seguente codice:

var totale = sommaCurried(2)(4);

Questa invocazione equivale alla chiamata di somma(2, 4) e assegna la somma di 2 e 4 alla variabile totale. Altro significato ha invece la seguente invocazione:

var sommaParziale = sommaCurried(2);

In questo caso alla variabile sommaParziale verrà assegnata la funzione che somma 2 ad un eventuale altro parametro. In altre parole, sommaCurried(2) equivale ad una applicazione parziale di somma().

Spesso viene fatta confusione tra applicazione parziale e currying. Tuttavia, anche se le due tecniche hanno una qualche relazione, esse sono operazioni del tutto diverse. Infatti, mentre l'applicazione parziale di una funzione con n parametri ottiene una nuova funzione con un numero inferiore di parametri, il currying restituisce una funzione con esattamente un solo parametro.

Inoltre, l'invocazione di una funzione parzialmente applicata
restituisce il risultato dell'applicazione completa; al contrario,
l'invocazione di una funzione a cui è stato applicato il currying
restituisce una funzione con un solo parametro, cioè una delle funzioni
della sequenza di n funzioni risultanti.

Proviamo a chiarire la differenza con un po' di codice.

Consideriamo la seguente funzione che applica il currying ad una
funzione:

function curry(fn) {
   var numOfArgs = fn.length;
   if (arguments.length - 1 < numOfArgs) {
      return curry.bind(null, ...arguments);
   } else {
      return fn.apply(null, Array.prototype.slice.call(arguments, 1));
   }
}

Senza scendere nei dettagli implementativi, questa funzione è in grado di applicare il currying alla funzione passata come parametro. Proviamo, ad esempio, ad applicarla alla funzione somma() definita più sopra:

var sommaCurried = curry(somma);

Potremo a questo punto utilizzare la funzione ottenuta sommaCurried() come abbiamo fatto in precedenza:

var totale = sommaCurried(2)(4);

Quindi, l'applicazione di sommaCurried() per un numero di volte pari al massimo numero di parametri previsti da somma() consente di ottenere lo stesso valore del risultato dell'applicazione di somma() a tutti i parametri previsti. Invece, l'applicazione di sommaCurried() ad un sottoinsieme dei parametri previsti da somma() genera una funzione che si aspetta l'applicazione dei successivi parametri:

var sommaParziale = sommaCurried(2);

Ciò vuol dire che l'applicazione parziale di una funzione può essere vista come la valutazione ad uno specifico punto di una funzione a cui è stato applicato il currying. Nel nostro caso la funzione sommaParziale() è il risultato dell'applicazione della funzione sommaCurried() fino al primo dei due parametri previsti da somma().


Ti consigliamo anche