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 lo desea, incluso podría aplicar parcialmente 3 de 3 argumentos y devolvería una función que no requiere argumento.
Entonces, dada la siguiente función:
f(x,y,z) = x + y + z;
Al vincular 1 a x y aplicarlo parcialmente a la función anterior f(x,y,z)
, obtendría:
f(1,y,z) = f'(y,z);
Dónde: f'(y,z) = 1 + y + z;
Ahora, si tuviera que unir y a 2 yz a 3, y aplicar parcialmente f'(y,z)
, obtendría:
f'(2,3) = f''();
Dónde: f''() = 1 + 2 + 3
;
Ahora, en cualquier momento, puede elegir evaluar f
, f'
o f''
. Entonces puedo hacer:
print(f''()) // and it would return 6;
o
print(f'(1,1)) // and it would return 3;
2) curry
Curry, por otro lado, es el proceso de dividir una función en una cadena anidada de funciones de un argumento. Nunca puede proporcionar más de 1 argumento, es uno o cero.
Entonces dada la misma función:
f(x,y,z) = x + y + z;
Si lo curriesas, obtendrás una cadena de 3 funciones:
f'(x) -> f''(y) -> f'''(z)
Dónde:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Ahora si llamas f'(x)
con x = 1
:
f'(1) = 1 + f''(y);
Se le devuelve una nueva función:
g(y) = 1 + f''(y);
Si llamas g(y)
con y = 2
:
g(2) = 1 + 2 + f'''(z);
Se le devuelve una nueva función:
h(z) = 1 + 2 + f'''(z);
Finalmente si llamas h(z)
con z = 3
:
h(3) = 1 + 2 + 3;
Volverá 6
.
3) cierre
Finalmente, el cierre es el proceso de capturar una función y datos juntos como una sola unidad. Un cierre de 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.
Nuevamente, 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);
Dónde:
f'(y,z) = x + y + z;
f'
está cerrado el x
. Lo que significa que f'
puede leer el valor de x que está dentro f
.
Entonces, si tuviera que llamar f
con x = 1
:
f(1) = 1 + f'(y, z);
Tendrían un cierre:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Ahora si llamaste closureOfF
con y = 2
y z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Que volvería 6
Conclusión
El curry, la aplicación parcial y los cierres son algo similares, ya que descomponen una función en más partes.
El curry descompone una función de múltiples argumentos en funciones anidadas de argumentos individuales que devuelven funciones de argumentos individuales. No tiene sentido cursar una función de uno o menos argumentos, ya que no tiene sentido.
La aplicación parcial descompone una función de argumentos múltiples en una función de argumentos menores cuyos argumentos ahora faltantes fueron sustituidos por el valor proporcionado.
El cierre descompone una función en una función y un conjunto de datos donde las variables dentro de la función que no se pasaron pueden mirar dentro del conjunto de datos para encontrar un valor al cual unirse cuando se le pide que evalúe.
Lo que es confuso acerca de todo esto es que pueden usarse para implementar un subconjunto de los demás. Entonces, en esencia, todos son un poco un detalle de implementación. Todos proporcionan un valor similar en el sentido de que no necesita reunir todos los valores por adelantado y en que puede reutilizar parte de la función, ya que la ha descompuesto en unidades discretas.
Divulgar
De ninguna manera soy un experto en el tema, solo recientemente comencé a aprender sobre esto, por lo que proporciono mi comprensión actual, pero podría tener errores que invito a señalar y corregiré como / si Descubro alguno.