En informática , la aplicación parcial (o aplicación parcial de función ) se refiere al proceso de fijar un número de argumentos de una función, produciendo otra función de aridad menor . Dada una función , podríamos fijar (o "vincular") el primer argumento, produciendo una función de tipo . La evaluación de esta función podría representarse como . Tenga en cuenta que el resultado de la aplicación parcial de función en este caso es una función que toma dos argumentos. A la aplicación parcial a veces se la llama incorrectamente currificación , que es un concepto relacionado, pero distinto.
Intuitivamente, la aplicación de funciones parciales dice "si fijas los primeros argumentos de la función, obtienes una función de los argumentos restantes". Por ejemplo, si la función div ( x , y ) = x / y , entonces div con el parámetro x fijo en 1 es otra función: div 1 ( y ) = div (1, y ) = 1/ y . Esto es lo mismo que la función inv que devuelve el inverso multiplicativo de su argumento, definido por inv ( y ) = 1/ y .
La motivación práctica para la aplicación parcial es que muy a menudo las funciones obtenidas al proporcionar algunos, pero no todos, los argumentos de una función son útiles; por ejemplo, muchos lenguajes tienen una función u operador similar a plus_one
. La aplicación parcial facilita la definición de estas funciones, por ejemplo, creando una función que represente el operador de suma con un límite de 1 como su primer argumento.
En lenguajes como ML , Haskell y F# , las funciones se definen en forma currificada de forma predeterminada. El suministro de una cantidad menor que la cantidad total de argumentos se denomina aplicación parcial.
En lenguajes con funciones de primera clase , se pueden definir curry
y para realizar la currificación y la aplicación parcial de forma explícita. Esto puede generar una mayor sobrecarga en tiempo de ejecución debido a la creación de cierres adicionales , mientras que Haskell puede utilizar técnicas más eficientes. [1]uncurry
papply
Scala implementa una aplicación parcial opcional con un marcador de posición, p. ej., devuelve una función incremental. Scala también admite listas de parámetros múltiples como currificación, p. ej. , .def add(x: Int, y: Int) = {x+y}; add(1, _: Int)
def add(x: Int)(y: Int) = {x+y}; add(1) _
Clojure implementa una aplicación parcial utilizando la partial
función definida en su biblioteca principal. [2]
La biblioteca estándar de C++bind(function, args..)
permite devolver un objeto de función que es el resultado de la aplicación parcial de los argumentos dados a la función dada. Desde C++20bind_front(function, args...)
también se proporciona la función que vincula los primeros sizeof...(args)
argumentos de la función a los argumentos. Por el contrario, bind
permite vincular cualquiera de los argumentos de la función que se le pasan, no solo los primeros. Alternativamente, se pueden utilizar expresiones lambda :
int f ( int a , int b ); auto f_partial = []( int a ) { return f ( a , 123 ); }; assert ( f_partial ( 456 ) == f ( 456 , 123 ) );
En Java , MethodHandle.bindTo
aplica parcialmente una función a su primer argumento. [3]
Alternativamente, desde Java 8, se pueden utilizar lambdas:
public static < A , B , R > Function < B , R > partialApply ( BiFunction < A , B , R > biFunc , A valor ) { return b -> biFunc .apply ( valor , b ) ; }
En Raku , el método de asunción crea una nueva función con menos parámetros. [4]
El módulo de la biblioteca estándar de Pythonfunctools
incluye la partial
función , que permite enlaces de argumentos posicionales y nombrados, y devuelve una nueva función. [5]
En XQuery , ?
se utiliza un marcador de argumento ( ) para cada argumento no fijo en una aplicación de función parcial. [6]
En la aplicación parcial del cálculo lambda de tipos simples con tipos de función y producto ( λ →,× ), la currificación y la descurrificación se pueden definir como
papply
curry
uncurry
Tenga en cuenta que curry
papply
= curry
.
La aplicación parcial puede ser una forma útil de definir varias nociones útiles en matemáticas.
Dados los conjuntos y , y una función , se puede definir la función
donde es el conjunto de funciones . La imagen de bajo este mapa es . Esta es la función que envía a . A menudo hay estructuras en las que significa que la imagen de se restringe a algún subconjunto de funciones , como se ilustra en los siguientes ejemplos.
Una acción de grupo puede entenderse como una función . La evaluación parcial se limita al grupo de biyecciones de a sí mismo. Los axiomas de acción de grupo aseguran además que se trata de un homomorfismo de grupo .
Un producto interno de un espacio vectorial sobre un cuerpo es una función . La evaluación parcial proporciona una función canónica al espacio vectorial dual , . Si este es el producto interno de un espacio de Hilbert , el teorema de representación de Riesz garantiza que se trata de un isomorfismo .
La aplicación parcial del producto vectorial de es . La imagen del vector es una función lineal tal que . Se puede encontrar que los componentes de son .
Esto está estrechamente relacionado con la aplicación adjunta para las álgebras de Lie . Las álgebras de Lie están equipadas con un corchete . La aplicación parcial da una aplicación . Los axiomas para el corchete aseguran que esta aplicación sea un homomorfismo de las álgebras de Lie.