Curry

Curry

> 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.

Esempio in Leekscript

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.

Quando vale la pena fare il curry?

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!