aplicación de función parcial es sobre la fijación de algunos argumentos de una función dada para producir otra función con menos argumentos, como
sum = lambda x, y: x + y
inc = lambda x: sum(x, 1)
en cuenta que 'inc' es 'suma' aplicado parcialmente, sin capturar cualquier cosa de el contexto (como mencionó el cierre).
Pero estas funciones escritas a mano (generalmente anónimas) son un poco tediosas. Uno puede usar una fábrica de funciones, que devuelve una función interna. La función interna se puede parametrizar mediante la captura de alguna variable de su contexto, como
# sum = lambda x, y: x + y
def makePartialSumF(n):
def partialSumF(x):
return sum(x, n)
return partialSumF
inc = makePartialSumF(1)
plusTwo = makePartialSumF(2)
Aquí la fábrica makePartialSumF se invoca dos veces. Cada llamada da como resultado una función partialSumF (capturando diferentes valores como n). Usar el cierre hace que la implementación de la aplicación parcial sea conveniente. Por lo tanto, puede decir que la aplicación parcial de se puede implementar mediante el cierre. ¡Por supuesto, los cierres pueden hacer muchas otras cosas! (Como un nodo lado, pitón no tiene cierre adecuado.)
Currying consiste en convertir una función de N argumentos en una función unario que devuelve una función unaria ... por ejemplo tenemos una función que tiene tres argumentos y devuelve un valor:
sum = lambda x, y, z: x + y + z
La versión curry es
curriedSum = lambda x: lambda y: lambda z: x + y + z
apuesto a que no iba a escribir código Python así. IMO la motivación de Currying es principalmente de interés teórico. (Un marco para expresar cálculos usando solo funciones unarias: cada función es unario!) El subproducto práctico es que, en los idiomas donde las funciones son al curry, algunas aplicaciones parciales (cuando 'arreglas' argumentos desde la izquierda) son tan triviales como suministrando argumentos a la función curried. (Pero no todas las aplicaciones parciales son como tales. Ejemplo: dadas f (x, y, z) = x + 2 * y + 3 * z, cuando se une a y a una constante para producir una función de dos variables). Se puede decir que Currying es una técnica que, en la práctica y como subproducto, puede hacer que muchas aplicaciones funcionales parciales útiles sean triviales, pero ese no es el punto de Currying.
He tratado de aclarar las cosas leyendo muchas cosas al respecto: hay mucha confusión entre currying y aplicaciones parciales, que comúnmente se intercambian pero son diferentes. Wikipedia dice: "aplicación parcial (o aplicación de función parcial) se refiere al proceso de fijar una cantidad de argumentos a una función, produciendo otra función de menor tamaño" – Cancer
que es exactamente lo que está sucediendo arriba. Por lo que puedo decir, currying es solo una expresión particular de la forma. – Hamish
Sí, ya veo, su código hace eso, y está bastante claro. Pero ... ¿acaso el mío no lo hace? De manera diferente, es obvio, no estoy pasando funciones como parámetros, pero también estoy arreglando un argumento y creando una función con arity menor que hace lo mismo y devuelve el mismo valor que si llamara a la función original con todos los parámetros . Lo siento, me siento bastante tonto, estoy perplejo ... – Cancer