Funzioni currying
Trasformi funzioni con più argomenti in catene.
Funzioni currying è una lezione JavaScript Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento JavaScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso JavaScript Academy include 4 lezioni in totale.
Cos'è il currying
Il currying trasforma una funzione che accetta molti argomenti in una sequenza di funzioni che ne accettano uno ciascuna.
Invece di add(1, 2, 3) si chiama add(1)(2)(3). Ogni chiamata restituisce la funzione successiva finché tutti gli argomenti non sono stati raccolti.
Implementare il currying manualmente
Il modo più chiaro per capire il currying consiste nello scrivere funzioni annidate, ognuna delle quali restituisce la successiva e mantiene gli argomenti precedenti tramite una closure.
function add(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
console.log(add(1)(2)(3));Restituzioni di funzioni freccia annidate
Le funzioni freccia rendono più brevi le definizioni con currying. Ogni => restituisce la funzione freccia successiva, mentre l'ultima esegue il lavoro.
const add = a => b => c => a + b + c;
console.log(add(1)(2)(3));
console.log(add(10)(20)(30));Le closure ricordano gli argomenti
Il currying si basa sulle closure. Ogni funzione restituita mantiene un riferimento alle variabili del proprio scope esterno, quindi gli argomenti precedenti restano disponibili fino all'esecuzione dell'ultima chiamata.
const greet = greeting => name => greeting + ', ' + name + '!';
const sayHi = greet('Hi');
console.log(sayHi('Ada'));
console.log(sayHi('Grace'));Chiamare passo dopo passo
Non è necessario applicare tutti gli argomenti contemporaneamente. È possibile fermarsi a metà e conservare il risultato parziale in una variabile per riutilizzarlo.
const add = a => b => c => a + b + c;
const addOne = add(1);
const addOneAndTwo = addOne(2);
console.log(addOneAndTwo(3));
console.log(addOneAndTwo(100));Un helper curry generico
Scrivere manualmente funzioni annidate è tedioso. Un helper curry generico raccoglie gli argomenti finché non ne ha abbastanza, quindi chiama la funzione originale.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1)(2)(3));Chiamate flessibili con curry
Un buon helper curry accetta gli argomenti raggruppati in qualsiasi modo. fn.length indica quanti parametri sono stati dichiarati dalla funzione originale.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
}
return (...more) => curried(...args, ...more);
};
}
const add = curry((a, b, c) => a + b + c);
console.log(add(1, 2, 3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));Specializzazione tramite currying
Il currying rende naturale la specializzazione: si applica il primo argomento e si riutilizza la funzione restituita in numerose chiamate.
const multiply = a => b => a * b;
const double = multiply(2);
const triple = multiply(3);
console.log(double(5));
console.log(triple(5));Currying con i metodi degli array
Le funzioni sottoposte a currying si inseriscono perfettamente in map e filter, perché ciascuna produce una funzione a un argomento pronta a ricevere ogni elemento.
const greaterThan = min => value => value > min;
const over10 = greaterThan(10);
console.log([5, 12, 8, 20].filter(over10));Currying e applicazione parziale
L'applicazione parziale fissa alcuni argomenti e lascia i restanti per un'unica chiamata successiva. Il currying scompone sempre una funzione in una catena di chiamate a un solo argomento.
Il currying è una forma specifica e completamente scomposta di applicazione parziale.
const partial = (a, b) => c => a + b + c;
const curried = a => b => c => a + b + c;
console.log(partial(1, 2)(3));
console.log(curried(1)(2)(3));Perché usare il curry?
Il currying favorisce funzioni piccole, componibili e riutilizzabili. Si abbina naturalmente alla composizione di funzioni, che esplorerà nella prossima lezione. L'idea chiave è che una funzione sottoposta a currying non è mai «incompleta»: restituisce semplicemente un'altra funzione finché non ha ricevuto tutti gli argomenti.
const tag = name => content => '<' + name + '>' + content + '</' + name + '>';
const bold = tag('b');
console.log(bold('important'));
console.log(tag('i')('slanted'));Verifica rapida
Data const add = a => b => c => a + b + c;, che cosa restituisce add(1)(2)?
Riepilogo: currying
Ha imparato a scomporre le funzioni in catene di argomenti singoli:
- Le funzioni sottoposte a currying restituiscono una nuova funzione per ogni argomento tramite le closure.
- Le arrow function annidate permettono di definire il currying in modo compatto.
- Un helper generico
curryusafn.lengthper sapere quando sono arrivati abbastanza argomenti. - Il currying consente una specializzazione e una composizione ordinate.
Domande Frequenti
La lezione «Funzioni currying» è gratuita?
Sì — il testo completo di «Funzioni currying» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso JavaScript Academy, passa a CoddyKit PRO. Il corso JavaScript Academy include 4 lezioni in totale.
Cosa imparerò in «Funzioni currying»?
Trasformi funzioni con più argomenti in catene. Eserciti JavaScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare JavaScript Academy?
Non è richiesta alcuna esperienza precedente. JavaScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Funzioni currying»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione JavaScript Academy?
Sì. Ogni lezione JavaScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.