En matemáticas y ciencias de la computación , apply es una función que aplica una función a argumentos. Es fundamental en los lenguajes de programación derivados del cálculo lambda , como LISP y Scheme , y también en los lenguajes funcionales . Tiene un papel en el estudio de la semántica denotacional de los programas informáticos, porque es una función continua en órdenes parciales completos . Apply también es una función continua en la teoría de homotopía y, de hecho, sustenta toda la teoría: permite que una deformación de homotopía se vea como un camino continuo en el espacio de funciones. Del mismo modo, las mutaciones válidas (refactorizaciones) de los programas informáticos pueden verse como aquellas que son "continuas" en la topología de Scott .
El contexto más general para su aplicación es la teoría de categorías , donde es adyacente a la currificación en categorías monoidales cerradas . Un caso especial de esto son las categorías cerradas cartesianas , cuyo lenguaje interno es simplemente el cálculo lambda tipificado .
En programación informática, apply aplica una función a una lista de argumentos. Eval y apply son los dos componentes interdependientes del ciclo eval-apply , que es la esencia de la evaluación de Lisp, descrita en SICP . [1] La función application corresponde a la reducción beta en el cálculo lambda .
Apply es también el nombre de una función especial en muchos lenguajes, que toma una función y una lista, y utiliza la lista como la lista de argumentos de la función, como si la función fuera llamada con los elementos de la lista como argumentos. Esto es importante en lenguajes con funciones variádicas , porque es la única forma de llamar a una función con un número indeterminado (en tiempo de compilación) de argumentos.
En Common Lisp, apply es una función que aplica una función a una lista de argumentos (tenga en cuenta aquí que "+" es una función variádica que toma cualquier número de argumentos):
( aplicar #' + ( lista 1 2 ))
De manera similar en el esquema:
( aplicar + ( lista 1 2 ))
En C++ , Bind [2] se utiliza a través del espacio de nombres std o a través del espacio de nombres boost.
En C# y Java , los argumentos variádicos se recopilan simplemente en una matriz. El llamador puede pasar explícitamente una matriz en lugar de los argumentos variádicos. Esto solo se puede hacer para un parámetro variádico. No es posible aplicar una matriz de argumentos a un parámetro no variádico sin usar reflection . Surge un caso ambiguo si el llamador desea pasar una matriz en sí misma como uno de los argumentos en lugar de usar la matriz como una lista de argumentos. En este caso, el llamador debe convertir la matriz a Object
para evitar que el compilador use la interpretación apply .
variadicFunc ( matrizDeArgs );
Con la versión 8 se introdujeron las expresiones lambda. Las funciones se implementan como objetos con una interfaz funcional, una interfaz con un solo método no estático. La interfaz estándar
Función < T , R >
consiste en el método (más algunas funciones de utilidad estáticas):
R aplicar ( T para )
En Go , los argumentos variádicos tipificados se recopilan simplemente en una porción. El llamador puede pasar explícitamente una porción en lugar de los argumentos variádicos, agregando un ...
al argumento de la porción. Esto solo se puede hacer para un parámetro variádico. El llamador no puede aplicar una matriz de argumentos a parámetros no variádicos sin usar la reflexión.
s := [] cadena { "foo" , "bar" } variadicFunc ( s ... )
En Haskell , las funciones se pueden aplicar mediante simple yuxtaposición:
función param1 param2 ...
En Haskell, la sintaxis también puede interpretarse como que cada parámetro ejecuta su función a su vez. En el ejemplo anterior, "func param1" devuelve otra función que acepta un parámetro menos, que luego se aplica a param2, y así sucesivamente, hasta que la función no tenga más parámetros.
En JavaScript , los objetos de función tienen un apply
método, el primer argumento es el valor de la this
palabra clave dentro de la función; el segundo es la lista de argumentos:
func .apply ( null , args ) ;
ES6 agrega el operador de propagación func(...args)
[3] que puede usarse en lugar de apply
.
En Lua , aplicar se puede escribir de esta manera:
función aplicar ( f ,...) devolver f (...) fin
En Perl , las matrices, hashes y expresiones se "aplanan" automáticamente en una sola lista cuando se evalúan en un contexto de lista, como en la lista de argumentos de una función.
# Llamadas de subrutina equivalentes: @args = ( @some_args , @more_args ); func ( @args ); func ( @algunos_args , @más_args );
En PHP , apply
se llama call_user_func_array
:
call_user_func_array ( 'nombre_función' , $args );
En Python y Ruby , la misma notación de asterisco utilizada para definir funciones variádicas se utiliza para llamar a una función en una secuencia y una matriz respectivamente:
func ( * argumentos )
Python originalmente tenía una función de aplicación, pero ésta quedó obsoleta en favor del asterisco en 2.3 y se eliminó en 3.0. [4]
En R , do.call
construye y ejecuta una llamada de función a partir de un nombre o una función y una lista de argumentos que se le pasarán:
f ( x1 , x2 ) # también se puede realizar mediante do.call ( what = f , args = list ( x1 , x2 ))
En Smalltalk , los objetos de bloque (función) tienen un valueWithArguments:
método que toma una matriz de argumentos:
aBlock valorConArgumentos: args
Desde Tcl 8.5, [5] se puede aplicar una función a los argumentos con el apply
comando
aplicar func ? arg1 arg2 ... ?
donde la función es una lista de dos elementos {args body} o una lista de tres elementos {args body namespace}.
Consideremos una función , es decir, donde la notación entre corchetes denota el espacio de funciones de A a B . Mediante la currificación , existe una función única . Luego, Aplicar proporciona el morfismo universal
de modo que
o, equivalentemente, se tiene el diagrama de conmutación
Más precisamente, curry y apply son funtores adjuntos .
La notación para el espacio de funciones de A a B se da con más frecuencia en informática. Sin embargo, en teoría de categorías , se conoce como objeto exponencial y se escribe como . También existen otras diferencias de notación comunes; por ejemplo, Apply se suele llamar Eval , [6] aunque en informática no son lo mismo, ya que eval se distingue de Apply por ser la evaluación de la forma de cadena entre comillas de una función con sus argumentos, en lugar de la aplicación de una función a algunos argumentos.
Además, en la teoría de categorías, curry se denota comúnmente por , por lo que se escribe como curry ( g ). Esta notación está en conflicto con el uso de en el cálculo lambda , donde lambda se usa para denotar variables ligadas. Con todos estos cambios de notación tomados en cuenta, la adjunción de Apply y curry se expresa entonces en el diagrama de conmutación
Los artículos sobre el objeto exponencial y la categoría cerrada cartesiana proporcionan una discusión más precisa de la formulación de esta idea desde el punto de vista de la teoría de categorías. Por lo tanto, el uso de lambda aquí no es accidental; el lenguaje interno de las categorías cerradas cartesianas es el cálculo lambda de tipo simple . La configuración más general posible para Apply son las categorías monoidales cerradas , de las cuales las categorías cerradas cartesianas son un ejemplo. En álgebra homológica , la adjunción de curry y apply se conoce como adjunción tensorial-hom .
En la teoría de órdenes , en la categoría de órdenes parciales completos dotados de la topología de Scott , tanto curry como apply son funciones continuas (es decir, son continuas de Scott ). [7] Esta propiedad ayuda a establecer la validez fundamental del estudio de la semántica denotacional de los programas informáticos.
En geometría algebraica y teoría de homotopía , curry y apply son funciones continuas cuando el espacio de funciones continuas de a tiene la topología abierta compacta y es localmente compacto Hausdorff . Este resultado es muy importante, ya que sustenta la teoría de homotopía, permitiendo que las deformaciones homotópicas se entiendan como caminos continuos en el espacio de funciones.