En informática , la aplicación parcial (o aplicación de función parcial ) se refiere al proceso de fijar una serie de argumentos a una función, produciendo otra función de menor aridad . Dada una función, podríamos arreglar (o 'enlazar') 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 de una función parcial en este caso es una función que toma dos argumentos. La aplicación parcial a veces se denomina incorrectamente curry , que es un concepto relacionado, pero distinto.
Motivación
Intuitivamente, la aplicación de función parcial dice "si arreglas 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 . 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 a una función, son útiles; por ejemplo, muchos idiomas 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 representa el operador de suma con 1 límite como primer argumento.
Implementaciones
En lenguajes como ML , Haskell y F # , las funciones se definen en forma de curry por defecto. Proporcionar menos argumentos que el número total de argumentos se denomina aplicación parcial.
En idiomas con funciones de primera clase se puede definir curry
, uncurry
y papply
para llevar a cabo currificación y la aplicación parcial de manera explícita. Esto podría generar una sobrecarga de tiempo de ejecución mayor debido a la creación de cierres adicionales , mientras que Haskell puede usar técnicas más eficientes. [1]
Scala implementa una aplicación parcial opcional con marcador de posición, por ejemplo, devuelve una función de incremento. Scala también admite múltiples listas de parámetros como preparación, por ejemplo .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 usando la partial
función definida en su biblioteca central. [2]
La biblioteca estándar de C ++ permite bind(function, args..)
devolver un objeto de función que es el resultado de la aplicación parcial de los argumentos dados a la función dada. Alternativamente, se pueden usar expresiones lambda :
int f ( int a , int b ); auto f_partial = [] ( int a ) { return f ( a , 123 ); }; afirmar ( f_parcial ( 456 ) == f ( 456 , 123 ) );
En Java , MethodHandle.bindTo
aplica parcialmente una función a su primer argumento. [3] Alternativamente, desde Java 8, se pueden usar lambdas:
public static < A , B , R > Función < B , R > parcialApply ( BiFunction < A , B , R > biFunc , valor A ) { return b -> biFunc . aplicar ( valor , b ); }
En Raku , el assuming
método crea una nueva función con menos parámetros. [4]
El módulo de biblioteca estándar de Pythonfunctools
incluye la partial
función, lo que permite enlaces de argumentos posicionales y con nombre, devolviendo una nueva función. [5]
En XQuery , ?
se usa un marcador de posición de argumento ( ) para cada argumento no fijo en una aplicación de función parcial. [6]
Definiciones
En el cálculo lambda de tipo simple con función y tipos de producto ( λ →, × ) aplicación parcial, el curado y el no curado se pueden definir como:
papply
- ((( a × b ) → c ) × a ) → ( b → c ) = λ ( f , x ). λy . f ( x , y )
curry
- (( a × b ) → c ) → ( a → ( b → c )) = λf . λx . λy . f ( x , y )
uncurry
- ( a → ( b → c )) → (( a × b ) → c ) = λf . λ ( x , y ). fxy
Tenga en cuenta que curry
papply
= curry
.
Ver también
- η-conversión
- POP-2
- Restricción (matemáticas) , el fenómeno más general de restringir una función a un subconjunto de su dominio.
Referencias
- ^ Marlow y Peyton Jones 2004
- ^ "clojure / clojure, función parcial" . GitHub . Consultado el 18 de julio de 2020 .
- ^ "MethodHandle (Java Platform SE 7)" . docs.oracle.com . Consultado el 12 de septiembre de 2018 .
- ^ "Método asumiendo" . docs.perl6.org . Consultado el 12 de septiembre de 2018 .
- ^ "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 .
- ^ "XQuery 3.1: un lenguaje de consulta XML" . www.w3.org . Consultado el 12 de septiembre de 2018 .
Otras lecturas
- Simon Marlow y Simon Peyton Jones (2004, 2006). "Hacer un curry rápido: Push / Enter vs Eval / Solicitar idiomas de orden superior" . ICFP '04 Actas de la novena conferencia internacional ACM SIGPLAN sobre programación funcional .
- Benjamin C. Pierce y col. "Aplicación parcial" , "Digresión: Curry" . Fundamentos de software .
enlaces externos
- Aplicación de función parcial en código Rosetta.
- Aplicación parcial en Haskell Wiki
- Forma de aplicación constante en Haskell Wiki
- Los peligros de ser demasiado parcial