Моє обмежене розуміння таке:
1) Часткове застосування функції
Застосування часткової функції - це процес повернення функції, яка бере меншу кількість аргументів. Якщо ви надасте 2 з 3 аргументів, він поверне функцію, яка приймає 3-2 = 1 аргумент. Якщо ви надаєте 1 з 3 аргументів, він поверне функцію, яка бере 3-1 = 2 аргументи. Якби ви хотіли, ви могли б навіть частково застосувати 3 з 3 аргументів, і це поверне функцію, яка не бере аргументу.
Отже, дана наступна функція:
f(x,y,z) = x + y + z;
Прив’язуючи 1 до x та частково застосовуючи це до вищевказаної функції, f(x,y,z)
ви отримаєте:
f(1,y,z) = f'(y,z);
Де: f'(y,z) = 1 + y + z;
Тепер, якщо ви прив’язуєте y до 2 і z до 3, і частково застосовуєте, f'(y,z)
ви отримаєте:
f'(2,3) = f''();
Де f''() = 1 + 2 + 3
:;
Тепер у будь-який момент можна вибрати оцінку f
, f'
або f''
. Тож я можу зробити:
print(f''()) // and it would return 6;
або
print(f'(1,1)) // and it would return 3;
2) Каррінг
З іншого боку, каррінг - це процес розбиття функції на вкладений ланцюг з однієї функції аргументу. Ніколи не можна навести більше одного аргументу, це один або нуль.
Отже, дана однакова функція:
f(x,y,z) = x + y + z;
Якби ви його зависли, ви отримаєте ланцюжок з 3-х функцій:
f'(x) -> f''(y) -> f'''(z)
Де:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Тепер, якщо ви телефонуєте f'(x)
з x = 1
:
f'(1) = 1 + f''(y);
Вам повертається нова функція:
g(y) = 1 + f''(y);
Якщо ви телефонуєте за g(y)
допомогою y = 2
:
g(2) = 1 + 2 + f'''(z);
Вам повертається нова функція:
h(z) = 1 + 2 + f'''(z);
Нарешті, якщо ви телефонуєте h(z)
з z = 3
:
h(3) = 1 + 2 + 3;
Вас повернули 6
.
3) закриття
Нарешті, закриття - це процес захоплення функції та даних разом як єдине ціле. Закриття функції може зайняти 0 до нескінченної кількості аргументів, але вона також усвідомлює не передані їй дані.
Знову ж таки, задавши ту саму функцію:
f(x,y,z) = x + y + z;
Замість цього можна написати завершення:
f(x) = x + f'(y, z);
Де:
f'(y,z) = x + y + z;
f'
закрито на x
. Значення, яке f'
може прочитати значення x, яке знаходиться всередині f
.
Так що якщо ви повинні були зателефонувати f
з x = 1
:
f(1) = 1 + f'(y, z);
Ви отримаєте закриття:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Тепер , якщо ви подзвонили closureOfF
з y = 2
і z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Який би повернувся 6
Висновок
Дегустація, часткове застосування та закриття дещо подібні тим, що вони розкладають функцію на більшу частину.
Currying розкладає функцію з декількох аргументів на вкладені функції одиничних аргументів, які повертають функції окремих аргументів. Немає сенсу викривляти функцію одного або менш аргументів, оскільки це не має сенсу.
Часткове застосування розкладає функцію з декількох аргументів на функцію менших аргументів, чиї відсутні аргументи були замінені на надане значення.
Закриття розбиває функцію на функцію та набір даних, де змінні всередині функції, які не передавались, можуть заглянути всередині набору даних, щоб знайти значення, яке пов'язує із собою, коли запитують оцінити.
Що все бентежить у тому, що кожен з них може використовуватись для реалізації підмножини інших. Таким чином, вони по суті є деталями реалізації. Всі вони надають аналогічну цінність у тому, що вам не потрібно збирати всі значення заздалегідь і тим, що ви можете повторно використовувати частину функції, оскільки ви розклали її на стримані одиниці.
Розкриття інформації
Я аж ніяк не знавець цієї теми, я лише нещодавно почав дізнаватися про них, і тому я даю своє сучасне розуміння, але це може мати помилки, які я запрошую вас вказати, і я виправлю як / якщо Я відкриваю будь-яку.