Curry

Curry

> LeekScript samouczek

*Ta strona jest częściowo przestarzała. W Leekscript curry służy tylko do zwiększenia czytelności kodu, nie zapisuje już operacji, ponieważ koszt wywołania funkcji jest zredukowany do 1 niezależnie od liczby parametrów. *

W programowaniu funkcjonalnym currying odnosi się do operacji, która przenosi funkcję wieloargumentową do funkcji jednoargumentowej i zwraca funkcję, która przyjmuje pozostałe argumenty. Operacja odwrotna jest oczywiście możliwa i nazywana jest dekurryfikacją.

Termin pochodzi od nazwiska amerykańskiego matematyka Haskella Curry'ego.

Przykład w Leekscript

Weźmy funkcję, która przyjmuje 2 argumenty i zwraca ich sumę:

funkcja dodaj(x, y) { zwróć x+y; }

Zamienia się w metodę curry

funkcja add_curried(x) { funkcja powrotu (y) { zwróć x+y; }; }

Przykład użycia

//Klasyczna metoda zmienna suma = dodaj(1, 3);

//Metoda curry var add1 = add_curried(1); var suma = dodaj1(3);

Ten przykład ma po prostu pokazać, jak to działa, w tym przypadku nie ma sensu przechodzić przez curry. Zobaczmy inny, ciekawszy przykład. Wyobraź sobie, że mamy tablicę n elementów numerycznych i chcemy dodać 1 do wszystkich elementów.

//Klasyczna metoda for(klucz var: element var w tablicy) { tablica[klucz] = dodaj(1, element); }

//Metoda curry var add1 = add_curried(1); for(klucz var: element var w tablicy) { tablica[klucz] = dodaj1(element); }

Zaletą jest tutaj optymalizacja, w pętli zamiast wywoływać funkcję z 2 parametrami, wywołujemy tylko funkcję z jednym parametrem. Im większa liczba elementów w tablicy, tym większy zysk.

Kiedy warto curry?

Jak widzieliśmy wcześniej, głównym zastosowaniem są funkcje wywoływane w pętlach, których jeden lub więcej parametrów nie zależy od pętli. Memoization to doskonały przykład użycia.

Weźmy na przykład naszą funkcję lineOfSight z zapamiętywaniem (zdefiniowaną tutaj):

Jeśli wywołamy tę funkcję w pętli, dwie operacje będą nas obciążać! Curryfikacja może nam pomóc:

Nasza funkcja zwraca inną funkcję, która może korzystać z parametrów pierwszej z nich. Za pierwszym razem jest to trochę trudne do zrozumienia, ale dobrze zastosowana ta metoda jest bardzo skuteczna! Małe ćwiczenie: możemy jeszcze bardziej zoptymalizować tę funkcję, od Ciebie zależy, jak to zrobić!