Avere una funzione f che accetta argomenti x 1 , x 2 ,…, x n
- ie. f: X 1 × X 2 ×… × X n → Y
- curry ridefinisce f come funzione prendendo un singolo argomento a 1 che si associa a un'altra funzione. Questa tecnica è utile per un'applicazione parziale, ad esempio con una pow
funzione al curry che potremmo scrivere exp = pow(e)
.
Esempio
Supponendo che abbiamo la seguente funzione f prendendo tre argomenti ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
L'attivazione di questa funzione ci lascia con f_curry: X 1 → (X 2 → (X 3 → Y)) , se ora chiamassimo quella funzione due volte f_curry(1)(2)
otterremmo una funzione ( h
) equivalente alla seguente restituita:
def h(c):
return 1 + 2 * c
La funzione al curry f
potrebbe essere scritta in questo modo (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Sfida
La tua sfida sarà quella di curry di una funzione come descritto sopra, ecco le regole:
- L'input sarà una funzione blackbox che accetta almeno 2 argomenti
- La funzione di input avrà sempre un numero fisso di argomenti (diverso
printf
o simile, nota: è necessario supportare funzioni con qualsiasi numero di argomenti ≥2) - Se la tua lingua utilizza funzioni curry per impostazione predefinita (ad es. Haskell), potresti aspettarti che la funzione di input sia definita su N -tuple, invece di una "funzione di ordine superiore"
- Puoi prendere il numero di argomenti come input
- L'output sarà l'equivalente al curry dell'ingresso *
- Si può presumere che la funzione di output sarà sempre e solo:
- chiamato con minore o uguale al numero di argomenti che accetta la funzione di input
- chiamato con argomenti del tipo giusto
* Ciò significherebbe per un input f
con N
argomenti e un output h
che per tutti gli argomenti validi a1,…,aN
lo sostiene f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
e l'uscita è def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(che è definito da qualche parte) e l'output dovrebbe essere qualcosa di equivalente f_curry
. O l'input sarebbe lambda a,b,c: a+b*c
e l'output sarebbe una funzione equivalente f_curry
.