Маючи функцію f, яка приймає аргументи x 1 , x 2 ,…, x n
- тобто. f: X 1 × X 2 ×… × X n → Y
- currying переосмислює f як функцію, що приймає єдиний аргумент a 1, який відображає ще одну функцію. Цей прийом корисний для часткового застосування, наприклад, із завитою pow
функцією, яку ми могли б написати exp = pow(e)
.
Приклад
Припустимо, що ми маємо таку функцію f, яка бере три аргументи ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Виконання цієї функції залишає нам f_curry: X 1 → (X 2 → (X 3 → Y)) , якщо ми зараз би двічі викликали цю функцію, f_curry(1)(2)
ми отримаємо функцію ( h
), еквівалентну наступному поверненому:
def h(c):
return 1 + 2 * c
Вироблена функція f
може бути записана так (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Виклик
Вашим завданням буде стати функцією, описаною вище, ось такі правила:
- Вхід буде функцією blackbox, яка бере щонайменше 2 аргументи
- Функція введення завжди матиме фіксовану кількість аргументів (на відміну від
printf
або подібних, зверніть увагу: вам потрібно підтримувати функції з будь-якою кількістю аргументів ≥2) - Якщо у вашій мові за замовчуванням використовуються вивірені функції (наприклад, Haskell), ви можете очікувати, що функція введення буде визначена через N- пар, замість "функції вищого порядку"
- Ви можете взяти кількість аргументів як вхідні дані
- Вихідним показником буде еквівалентний вхід *
- Ви можете припустити, що функція виводу завжди буде:
- викликається з меншою або рівною кількістю аргументів, яку приймає функція введення
- викликається аргументами правильного типу
* Це буде означати для введення f
зN
аргументами та висновку, h
що для всіх дійсних аргументів a1,…,aN
це має місце f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
а вихід є def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(що визначено десь), а вихід повинен бути чимось еквівалентним f_curry
. Або вхід буде, lambda a,b,c: a+b*c
а вихід - еквівалентною функції f_curry
.