Имея функцию f, которая принимает аргументы x 1 , x 2 ,…, x n
- т.е. f: X 1 × X 2 ×… × X n → Y
- curry переопределяет 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
Вызов
Ваша задача будет заключаться в том, чтобы карри функции, как описано выше, вот правила:
- Ввод будет функцией черного ящика, которая принимает как минимум 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
.