Имея функцию 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.