En matemáticas e informática , aplicar es una función que aplica una función a argumentos. Es fundamental para 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 programas de computadora, porque es una función continua en órdenes parciales completas . Aplicar también es una función continua en la teoría de la homotopía y, de hecho, sustenta toda la teoría: permite ver una deformación de la homotopía como un camino continuo en el espacio de funciones. Asimismo, las mutaciones válidas (refactorizaciones) de programas informáticos pueden verse como aquellas que son "continuas" en la topología de Scott .
El entorno más general para su aplicación es la teoría de categorías , donde es un complemento adecuado al curry en categorías monoidales cerradas . Un caso especial de esto son las categorías cerradas cartesianas , cuyo lenguaje interno es simplemente cálculo lambda tipificado .
En programación de computadoras, aplicar 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 aplicación de la función corresponde a la reducción beta en el cálculo lambda .
Aplicar es también el nombre de una función especial en muchos idiomas, que toma una función y una lista, y usa la lista como la propia 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 variadas , porque esta 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 , aplicar es una función que aplica una función a una lista de argumentos (tenga en cuenta aquí que "+" es una función variada 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 usa a través del espacio de nombres estándar o mediante el espacio de nombres boost.
En C# y Java , los argumentos variados simplemente se recopilan en una matriz. La persona que llama puede pasar explícitamente una matriz en lugar de los argumentos variados. Esto sólo se puede hacer para un parámetro variado. No es posible aplicar una serie de argumentos a un parámetro no variable sin utilizar la reflexión . Surge un caso ambiguo si la persona que llama quiere pasar una matriz como uno de los argumentos en lugar de usar la matriz como una lista de argumentos. En este caso, la persona que llama debe convertir la matriz a Object
para evitar que el compilador utilice la interpretación de aplicación .
variadicFunc ( arrayOfArgs );
Con la versión 8 se introdujeron 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 >
Consisten en el método (más algunas funciones de utilidad estáticas):
R aplicar ( T para )
En Go , los argumentos variados escritos simplemente se recopilan en un segmento. La persona que llama puede pasar explícitamente un segmento en lugar de los argumentos variados, agregando a ...
al argumento del segmento. Esto sólo se puede hacer para un parámetro variado. La persona que llama no puede aplicar una serie de argumentos a parámetros no variables sin utilizar la reflexión.
s := [] cadena { "foo" , "bar" } variadicFunc ( s ... )
En Haskell , las funciones se pueden aplicar mediante yuxtaposición simple:
función parámetro1 parámetro2 ...
En Haskell, la sintaxis también se puede interpretar como que cada parámetro cumple 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:
función . aplicar ( nulo , argumentos );
ES6 agrega el operador de extensión func(...args)
[3] que puede usarse en lugar de apply
.
En Lua , aplicar se puede escribir de esta manera:
función aplicar ( f ,...) return 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 a subrutinas equivalentes: @args = ( @some_args , @more_args ); función ( @args ); función ( @some_args , @more_args );
En PHP , apply
se llama call_user_func_array
:
call_user_func_array ( 'nombre_func' , $args );
En Python y Ruby , la misma notación de asterisco utilizada para definir funciones variadas se utiliza para llamar a una función en una secuencia y una matriz, respectivamente:
función ( * argumentos )
Python originalmente tenía una función de aplicación, pero quedó obsoleta en favor del asterisco en 2.3 y eliminada en 3.0. [4]
En R , do.call
construye y ejecuta una llamada de función a partir de un nombre o 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 serie de argumentos:
un valor de bloque con argumentos: args
Desde Tcl 8.5, [5] se puede aplicar una función a argumentos con el apply
comando
aplicar función ? arg1 arg2 ... ?
donde la función es una lista de dos elementos {args body} o una lista de tres elementos {args body namespace}.
Considere una función , es decir, donde la notación entre corchetes denota el espacio de funciones de A a B. Mediante el curry , existe una función única . Entonces Apply proporciona el morfismo universal.
de modo que
o, de manera equivalente, 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 ocurre más comúnmente en informática. En teoría de categorías , sin embargo, se conoce como objeto exponencial y se escribe como . También existen otras diferencias de notación comunes; por ejemplo , Apply a menudo se llama Eval , [6] aunque en informática no son lo mismo, distinguiéndose eval de Apply como 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, el curry se denota comúnmente por , por lo que se escribe para 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. Una vez tenidos en cuenta todos estos cambios de notación, la unión de Apply y curry se expresa en el diagrama de conmutación.
Los artículos sobre objeto exponencial y categoría cerrada cartesiana proporcionan una discusión más precisa de la formulación teórica de categorías de esta idea. Por 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 Aplicar son las categorías monoidales cerradas , de las cuales las categorías cerradas cartesianas son un ejemplo. En álgebra homológica , la unión de curry y apply se conoce como conjunción tensor-hom .
En teoría del orden , 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 de computadora.
En geometría algebraica y teoría de homotopía , curry y apply son funciones continuas cuando al espacio de funciones continuas desde a se le da la topología abierta compacta y es Hausdorff localmente compacto . Este resultado es muy importante porque sustenta la teoría de la homotopía, permitiendo entender las deformaciones homotópicas como caminos continuos en el espacio de funciones.