Tener una función f que toma argumentos x 1 , x 2 , ..., x n
- es decir. f: X 1 × X 2 ×… × X n → Y
- curry redefine f como una función tomando un solo argumento a 1 que se asigna a otra función más. Esta técnica es útil para aplicaciones parciales, por ejemplo, con una pow
función currificada que podríamos escribir exp = pow(e)
.
Ejemplo
Suponiendo que tenemos la siguiente función f tomando tres argumentos ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Curry esta función nos deja con f_curry: X 1 → (X 2 → (X 3 → Y)) , si ahora llamamos a esa función dos veces con f_curry(1)(2)
, obtendríamos una función ( h
) equivalente a la siguiente devuelta:
def h(c):
return 1 + 2 * c
La función curry f
podría escribirse así (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Desafío
Su desafío será curry una función como se describe anteriormente, aquí están las reglas:
- La entrada será una función de caja negra que toma al menos 2 argumentos
- La función de entrada siempre tendrá un número fijo de argumentos (a diferencia
printf
o similar, nota: debe admitir funciones con cualquier número de argumentos ≥2) - Si su lenguaje usa funciones curriculares por defecto (por ejemplo, Haskell), puede esperar que la función de entrada se defina sobre N -tuplas, en lugar de una "función de orden superior"
- Puede tomar el número de argumentos como entrada
- La salida será el equivalente al curry de la entrada *
- Puede suponer que la función de salida solo será:
- llamado con menos o igual al número de argumentos que toma la función de entrada
- llamado con argumentos del tipo correcto
* Esto significaría para una entrada f
con N
argumentos y una salida h
que para todos los argumentos válidos a1,…,aN
contiene eso f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
y la salida es def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(que se define en alguna parte) y la salida debería ser algo equivalente a f_curry
. O la entrada sería lambda a,b,c: a+b*c
y la salida una función equivalente a f_curry
.