Маючи функцію 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.