Eine Funktion f haben , die die Argumente x 1 , x 2 ,…, x n annimmt
- dh. f: X 1 × X 2 ×… × X n → Y
- currying definiert f als eine Funktion neu, wobei ein einzelnes Argument a 1 verwendet wird, das einer weiteren Funktion zugeordnet ist. Diese Technik ist nützlich für eine teilweise Anwendung, zum Beispiel mit einer Curry- pow
Funktion, die wir schreiben könnten exp = pow(e)
.
Beispiel
Angenommen, wir haben die folgende Funktion f mit drei Argumenten ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Wenn wir diese Funktion aufrufen, erhalten wir f_curry: X 1 → (X 2 → (X 3 → Y)) . Wenn wir diese Funktion jetzt zweimal mit aufrufen f_curry(1)(2)
würden, würden wir eine function ( h
) erhalten, die dem folgenden Ergebnis entspricht:
def h(c):
return 1 + 2 * c
Die Curry-Funktion f
könnte so geschrieben werden (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Herausforderung
Deine Herausforderung wird darin bestehen, eine Funktion wie oben beschrieben zu curry. Hier sind die Regeln:
- Die Eingabe ist eine Blackbox-Funktion, die mindestens 2 Argumente akzeptiert
- Die Eingabefunktion hat immer eine feste Anzahl von Argumenten (anders als
printf
oder ähnlich, Anmerkung: Sie müssen Funktionen mit einer beliebigen Anzahl von Argumenten ≥2 unterstützen) - Wenn Ihre Sprache standardmäßig Curry-Funktionen verwendet (z. B. Haskell), können Sie erwarten, dass die Eingabefunktion über N- Tupel definiert wird, anstatt über eine Funktion "höherer Ordnung".
- Sie können die Anzahl der Argumente als Eingabe verwenden
- Der Output ist das aktuelle Äquivalent des Inputs *
- Sie können davon ausgehen, dass die Ausgabefunktion immer nur:
- wird mit weniger oder gleich der Anzahl der Argumente aufgerufen, die die Eingabefunktion annimmt
- mit Argumenten des richtigen Typs aufgerufen
* Dies würde für eine Eingabe f
mit N
Argumenten und für eine Ausgabe bedeuten, h
dass für alle gültigen Argumente a1,…,aN
dies gilt f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
und der ausgang ist def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(die irgendwo definiert ist) und die Ausgabe sollte etwas Äquivalentes sein f_curry
. Oder die Eingabe wäre lambda a,b,c: a+b*c
und die Ausgabe eine äquivalente Funktion f_curry
.