Mi comprensión limitada es tal:
1) Aplicación de función parcial
Aplicación de función parcial es el proceso de devolver una función que toma un número menor de argumentos. Si proporciona 2 de 3 argumentos, devolverá una función que toma 3-2 = 1 argumento. Si proporciona 1 de 3 argumentos, devolverá una función que toma 3-1 = 2 argumentos. Si quisiera, incluso podría aplicar parcialmente 3 de los 3 argumentos y devolvería una función que no acepta ningún argumento.
Dada la siguiente función:
f(x,y,z) = x + y + z;
Al vincular 1 a xy aplicarlo parcialmente a la función anterior f(x,y,z)
obtendrías:
f(1,y,z) = f'(y,z);
Donde: f'(y,z) = 1 + y + z;
Ahora, si tuviera que vincular y a 2 y z a 3, y aplicar parcialmente f'(y,z)
, obtendría:
f'(2,3) = f''();
Donde: f''() = 1 + 2 + 3
;
Ahora, en cualquier punto, puede elegir evaluar f
, f'
o f''
. Así que puedo hacer:
print(f''()) // and it would return 6;
o
print(f'(1,1)) // and it would return 3;
2) Currying
Currying , por otro lado, es el proceso de dividir una función en una cadena anidada de un argumento. Nunca puedes proporcionar más de 1 argumento, es uno o cero.
Dada la misma función:
f(x,y,z) = x + y + z;
Si lo hicieras, obtendrías una cadena de 3 funciones:
f'(x) -> f''(y) -> f'''(z)
Donde:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Ahora si llama a f'(x)
con x = 1
:
f'(1) = 1 + f''(y);
Se te devuelve una nueva función:
g(y) = 1 + f''(y);
Si llama a g(y)
con y = 2
:
g(2) = 1 + 2 + f'''(z);
Se te devuelve una nueva función:
h(z) = 1 + 2 + f'''(z);
Finalmente, si llama a h(z)
con z = 3
:
h(3) = 1 + 2 + 3;
Te devuelven 6
.
3) Cierre
Finalmente, Cierre es el proceso de capturar una función y datos juntos como una sola unidad. El cierre de una función puede llevar de 0 a un número infinito de argumentos, pero también es consciente de los datos que no se le pasan.
De nuevo, dada la misma función:
f(x,y,z) = x + y + z;
En su lugar, puede escribir un cierre:
f(x) = x + f'(y, z);
Donde:
f'(y,z) = x + y + z;
f'
está cerrado en x
. Lo que significa que f'
puede leer el valor de x que está dentro de f
.
Entonces, si tuvieras que llamar a f
con x = 1
:
f(1) = 1 + f'(y, z);
Obtendría un cierre:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Ahora, si llamó a closureOfF
con y = 2
y z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Lo que devolvería 6
Conclusión
El curry, la aplicación parcial y los cierres son todos algo similares en cuanto a que descomponen una función en más partes.
El curry descompone una función de múltiples argumentos en funciones anidadas de argumentos únicos que devuelven funciones de argumentos individuales. No tiene sentido aplicar una función de uno o menos argumentos, ya que no tiene sentido.
La aplicación parcial descompone una función de múltiples argumentos en una función de argumentos menores cuyos argumentos ahora perdidos fueron sustituidos por el valor proporcionado.
El cierre descompone una función en una función y un conjunto de datos en el que las variables dentro de la función que no se pasaron pueden mirar dentro del conjunto de datos para encontrar un valor al que vincularse cuando se le pide evaluar.
Lo que es confuso acerca de todo esto es que pueden usarse para implementar un subconjunto de los otros. Así que en esencia, todos son un poco de un detalle de implementación. Todos proporcionan un valor similar en el sentido de que no es necesario recopilar todos los valores por adelantado y en que puede reutilizar parte de la función, ya que la ha descompuesto en unidades discretas.
Disclosure
De ninguna manera soy un experto en el tema, solo recientemente comencé a aprender sobre esto, por lo que ofrezco mi comprensión actual, pero podría tener errores que los invito a señalar y los corregiré. Como / si descubro alguna.