Posiadanie funkcji f, która przyjmuje argumenty x 1 , x 2 ,…, x n
- tj. f: X 1 × X 2 ×… × X n → Y
- curry redefiniuje f jako funkcję przyjmującą pojedynczy argument a 1, który odwzorowuje na jeszcze jedną funkcję. Ta technika jest przydatna do częściowego zastosowania, na przykład z pow
funkcją curry, którą moglibyśmy napisać exp = pow(e)
.
Przykład
Zakładając, że mamy następującą funkcję f przyjmującą trzy argumenty ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Curry tej funkcji pozostawia nam f_curry: X 1 → (X 2 → (X 3 → Y)) , jeśli teraz wywołalibyśmy tę funkcję dwa razy f_curry(1)(2)
, otrzymalibyśmy funkcję ( h
) równoważną z następującym:
def h(c):
return 1 + 2 * c
Funkcję curry f
można zapisać w następujący sposób (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Wyzwanie
Twoim wyzwaniem będzie wywołanie funkcji w sposób opisany powyżej, oto zasady:
- Wejście będzie funkcją blackboksa, która przyjmuje co najmniej 2 argumenty
- Funkcja wejściowa zawsze będzie miała stałą liczbę argumentów (w przeciwieństwie do
printf
podobnych, uwaga: musisz obsługiwać funkcje z dowolną liczbą argumentów ≥2) - Jeśli twój język domyślnie korzysta z funkcji curry (np. Haskell), możesz oczekiwać, że funkcja wejściowa zostanie zdefiniowana w liczbie N -zamiast zamiast „funkcji wyższego rzędu”
- Jako argument można przyjąć liczbę argumentów
- Dane wyjściowe będą curry równoważnikiem *
- Możesz założyć, że funkcją wyjściową będzie zawsze:
- wywoływany z mniejszą lub równą liczbą argumentów pobieranych przez funkcję wejściową
- wywoływany z argumentami odpowiedniego typu
* Oznaczałoby to dla wejścia f
z N
argumentami i mocy h
, że dla wszystkich ważnych argumentów a1,…,aN
jest warunek f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
i wyjście jest def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(które gdzieś zdefiniowane), a dane wyjściowe powinny być czymś równoważnym f_curry
. Albo wejście byłoby, lambda a,b,c: a+b*c
a wyjście funkcją równoważną f_curry
.