> Tutorial LeekScript
*Questa pagina è parzialmente obsoleta. In Leekscript il currying serve solo a rendere il codice più leggibile, non salva più le operazioni in quanto il costo di una chiamata a una funzione si riduce a 1 indipendentemente dal numero di parametri. *
Nella programmazione funzionale, il currying si riferisce all'operazione che porta una funzione con più argomenti a una funzione con un solo argomento e restituisce una funzione che prende il resto degli argomenti. L'operazione inversa è ovviamente possibile e si chiama decurrificazione.
Il termine deriva dal nome del matematico americano Haskell Curry.
Prendiamo una funzione che accetta 2 argomenti e restituisce la somma dei 2:
funzione add(x, y) { ritorno x+y; }
Si trasforma in metodo al curry
funzione add_curried(x) { funzione di ritorno(y) { ritorno x+y; }; }
Esempio di utilizzo
//Metodo classico var somma = add(1, 3);
//Metodo al curry var add1 = add_curried(1); var somma = add1(3);
Questo esempio è solo per mostrare semplicemente come funziona, in questo caso non ha senso passare attraverso il curry. Vediamo un altro esempio più interessante. Immagina di avere un array di n elementi numerici e di voler aggiungere 1 a tutti gli elementi.
//Metodo classico for(chiave var:elemento var nell'array) { array[chiave] = add(1, elemento); }
//Metodo al curry var add1 = add_curried(1); for(chiave var:elemento var nell'array) { array[chiave] = add1(elemento); }
Il vantaggio qui si vede in termini di ottimizzazione, nel ciclo invece di chiamare una funzione con 2 parametri, chiamiamo solo una funzione con un parametro. Maggiore è il numero di elementi nell'array, maggiore è il guadagno.
Come abbiamo visto in precedenza, l'utilizzo principale è per le funzioni chiamate nei cicli e uno o più dei cui parametri non dipendono dal ciclo. Memoization è un perfetto esempio di utilizzo.
Prendiamo ad esempio la nostra funzione lineOfSight con memoization (definita qui):
Se chiamiamo questa funzione in un ciclo, le due operazioni ci appesantiranno! La currificazione può aiutarci:
La nostra funzione restituisce un'altra funzione, che può utilizzare i parametri della prima, è un po' difficile da capire la prima volta, ma ben utilizzato questo metodo è molto efficace! Un piccolo esercizio: possiamo ottimizzare ancora di più questa funzione, sta a te scoprire come!
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.