stringtranslate.com

Solicitud parcial

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 veces, la aplicación parcial se denomina incorrectamente currificación , que es un concepto relacionado, pero distinto.

Motivación

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.

Implementaciones

En lenguajes como ML , Haskell y F# , las funciones se definen en forma currificada de manera 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 curryy para realizar currificación y aplicación parcial explícitamente. Esto puede generar una mayor sobrecarga en tiempo de ejecución debido a la creación de cierres adicionales , mientras que Haskell puede usar técnicas más eficientes. uncurry[ 1]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 partialfunció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, bindpermite 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.bindToaplica 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 partialfunció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]

Definiciones

En el cálculo lambda de tipos simples con tipos de función y producto ( λ →,× ), la aplicación parcial, la currificación y la descurrificación se pueden definir como

papply
((( a × b ) → c ) × a ) → ( bc ) = λ ( f , x ). λy . f ( x , y )
curry
(( a × b ) → c ) → ( a → ( bc )) = λf . λx . λy . f ( x , y )
uncurry
( a → ( bc )) → (( a × b ) → c ) = λf . λ ( x , y ). fxy

Tenga en cuenta que curry papply= curry.

Formulación matemática y ejemplos

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.

Acciones grupales

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 .

Productos internos y mapa canónico del dual

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 .

Productos cruzados y la función adjunta para álgebras de Lie

La aplicación parcial del producto vectorial de es . La imagen del vector es una función lineal tal que . Se puede determinar 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.

Véase también

Referencias

  1. ^ Marlow y Peyton Jones 2004
  2. ^ "clojure/clojure, función parcial". GitHub . Consultado el 18 de julio de 2020 .
  3. ^ "MethodHandle (Java Platform SE 7)". docs.oracle.com . Consultado el 12 de septiembre de 2018 .
  4. ^ "Método asumiendo". docs.perl6.org . Consultado el 12 de septiembre de 2018 .
  5. ^ "10.2. functools — Funciones y operaciones de orden superior en objetos invocables — Documentación de Python 3.7.0". docs.python.org . Consultado el 12 de septiembre de 2018 .
  6. ^ "XQuery 3.1: Un lenguaje de consulta XML". www.w3.org . Consultado el 12 de septiembre de 2018 .

Lectura adicional

Enlaces externos