Moje ograniczone zrozumienie jest takie:
1) Zastosowanie funkcji częściowej
Aplikacja funkcji częściowej to proces zwracający funkcję, która przyjmuje mniejszą liczbę argumentów. Jeśli podasz 2 z 3 argumentów, funkcja zwróci 3-2 = 1 argument. Jeśli podasz 1 z 3 argumentów, zwróci funkcję, która przyjmuje 3-1 = 2 argumenty. Jeśli chcesz, możesz nawet częściowo zastosować 3 z 3 argumentów, a to zwróci funkcję, która nie przyjmuje argumentu.
Biorąc pod uwagę następującą funkcję:
f(x,y,z) = x + y + z;
Przy wiązaniu 1 do x i częściowym zastosowaniu tego do powyższej funkcji f(x,y,z)
otrzymasz:
f(1,y,z) = f'(y,z);
Gdzie: f'(y,z) = 1 + y + z;
Teraz, jeśli miałbyś przypisać y do 2 i z do 3, a częściowo zastosować f'(y,z)
, otrzymasz:
f'(2,3) = f''();
Gdzie f''() = 1 + 2 + 3
:;
Teraz w dowolnym momencie, można wybrać, aby ocenić f
, f'
czy f''
. Więc mogę zrobić:
print(f''()) // and it would return 6;
lub
print(f'(1,1)) // and it would return 3;
2) Curry
Z drugiej strony curry to proces dzielenia funkcji na zagnieżdżony łańcuch funkcji jednego argumentu. Nigdy nie możesz podać więcej niż jednego argumentu, jest to jeden lub zero.
Biorąc pod uwagę tę samą funkcję:
f(x,y,z) = x + y + z;
Jeśli to zrobisz, uzyskasz łańcuch 3 funkcji:
f'(x) -> f''(y) -> f'''(z)
Gdzie:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Teraz, jeśli zadzwonisz f'(x)
z x = 1
:
f'(1) = 1 + f''(y);
Otrzymałeś nową funkcję:
g(y) = 1 + f''(y);
Jeśli zadzwonisz g(y)
z y = 2
:
g(2) = 1 + 2 + f'''(z);
Otrzymałeś nową funkcję:
h(z) = 1 + 2 + f'''(z);
Wreszcie, jeśli zadzwonisz h(z)
z z = 3
:
h(3) = 1 + 2 + 3;
Jesteś zwrócony 6
.
3) Zamknięcie
Wreszcie, Zamknięcie to proces przechwytywania funkcji i danych razem jako pojedynczej jednostki. Zamknięcie funkcji może zająć 0 do nieskończonej liczby argumentów, ale jest także świadomy danych, które do niej nie są przekazywane.
Ponownie, biorąc pod uwagę tę samą funkcję:
f(x,y,z) = x + y + z;
Zamiast tego możesz napisać zamknięcie:
f(x) = x + f'(y, z);
Gdzie:
f'(y,z) = x + y + z;
f'
jest zamknięty x
. Oznacza to, że f'
można odczytać wartość x, która jest w środku f
.
Więc jeśli miałbyś zadzwonić f
z x = 1
:
f(1) = 1 + f'(y, z);
Dostaniesz zamknięcie:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Teraz, jeśli zadzwoniłeś za closureOfF
pomocą y = 2
i z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Które wróci 6
Wniosek
Curry, częściowe zastosowanie i zamknięcia są nieco podobne, ponieważ rozkładają funkcję na więcej części.
Curry rozkłada funkcję wielu argumentów na zagnieżdżone funkcje pojedynczych argumentów, które zwracają funkcje pojedynczych argumentów. Nie ma sensu currywać funkcji jednego lub mniej argumentu, ponieważ nie ma to sensu.
Częściowa aplikacja rozkłada funkcję wielu argumentów na funkcję mniejszych argumentów, których obecnie brakujących argumentów zastąpiono podaną wartością.
Zamknięcie rozkłada funkcję na funkcję i zestaw danych, w którym zmienne wewnątrz funkcji, które nie zostały przekazane, mogą zaglądać do zestawu danych w celu znalezienia wartości do powiązania, gdy zostanie poproszony o ocenę.
Mylące w tym wszystkim jest to, że mogą one być używane do implementacji podzbioru pozostałych. W gruncie rzeczy wszystkie są trochę szczegółami implementacyjnymi. Wszystkie zapewniają podobną wartość, ponieważ nie trzeba zbierać wszystkich wartości z góry, i że można ponownie użyć części funkcji, ponieważ rozłożyłeś ją na dyskretne jednostki.
Ujawnienie
W żadnym wypadku nie jestem ekspertem w tej dziedzinie, dopiero niedawno zacząłem się o nich uczyć, dlatego zapewniam moje obecne zrozumienie, ale mogą zawierać błędy, na które chciałbym zwrócić uwagę, i poprawię je, jeśli: Odkryłem każdy.