En matemáticas e informática , aplicar es una función que aplica una función a los 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 los programas de computadora, porque es una función continua en órdenes parciales completos . 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 que una deformación de homotopía se vea como un camino continuo en el espacio de funciones. Asimismo, las mutaciones válidas (refactorizaciones) de los programas informáticos pueden considerarse "continuas" en la topología de Scott .
La configuración más general para la aplicación es en la teoría de categorías , donde está junto al currying en categorías monoidales cerradas . Un caso especial de esto son las categorías cerradas cartesianas , cuyo lenguaje interno es simplemente cálculo lambda tipado .
Programación
En programación de computadoras, aplicar aplica una función a una lista de argumentos. Evaluar y aplicar son los dos componentes interdependientes del ciclo evaluar -aplicar , que es la esencia de evaluar Lisp, descrito en SICP . [1] La aplicación de la función corresponde a la reducción beta en el cálculo lambda .
Aplicar función
Aplicar es también el nombre de una función especial en muchos lenguajes, 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 es la única forma de llamar a una función con un número indeterminado (en tiempo de compilación) de argumentos.
Common Lisp y Scheme
En Common Lisp, aplicar es una función que aplica una función a una lista de argumentos (observe aquí que "+" es una función variada que toma cualquier número de argumentos):
( aplicar # ' + ( lista 1 2 ))
De manera similar en Scheme:
( aplicar + ( lista 1 2 ))
C ++
En C ++ , Bind [2] se usa a través del espacio de nombres estándar o mediante el espacio de nombres boost.
C # y Java
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 variádicos. Esto solo se puede hacer para un parámetro variadic. No es posible aplicar una matriz de argumentos a un parámetro no variable sin utilizar la reflexión . Surge un caso ambiguo si la persona que llama desea pasar una matriz 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 utilice la interpretación de aplicación .
variadicFunc ( arrayOfArgs );
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 >
consisten en el método (más algunas funciones de utilidad estáticas):
R aplicar ( T para )
Ir
En Go , los argumentos variádicos escritos simplemente se recopilan en un segmento. La persona que llama puede pasar explícitamente un segmento en lugar de los argumentos variádicos, agregando un ...
al argumento segmento. Esto solo se puede hacer para un parámetro variadic. La persona que llama no puede aplicar una matriz de argumentos a parámetros no variádicos sin utilizar la reflexión.
s: = [] cadena {"foo", "bar"}variadicFunc (s ...)
Haskell
En Haskell , las funciones se pueden aplicar por simple yuxtaposición:
func param1 param2 ...
En Haskell, la sintaxis también se puede interpretar que cada parámetro realiza 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.
JavaScript
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 . aplicar ( nulo , argumentos );
ES6 agrega el operador de propagación func(...args)
[3] que se puede utilizar en lugar de apply
.
Lua
En Lua , aplicar se puede escribir de esta manera:
función aplicar ( f , ...) volver f (...) fin
Perl
En Perl , las matrices, los hashes y las 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 ); func ( @args );func ( @algunos_args , @más_args );
PHP
En PHP , apply
se llama call_user_func_array
:
call_user_func_array ( 'func_name' , $ args );
Python y Ruby
En Python y Ruby , la misma notación de asterisco utilizada para definir funciones variadas se usa para llamar a una función en una secuencia y matriz respectivamente:
func ( * argumentos )
Python originalmente tenía una función de aplicación, pero esta se desaprobó a favor del asterisco en 2.3 y se eliminó en 3.0. [4]
R
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 a través de do.call ( what = f , args = list ( x1 , x2 ))
Charla
En Smalltalk , los objetos de bloque (función) tienen un valueWithArguments:
método que toma una matriz de argumentos:
aBlock valueWithArguments: args
Tcl
Desde Tcl 8.5, [5] una función se puede aplicar a argumentos con el apply
comando
aplicar func ? arg1 arg2 ... ?
donde la función es una lista de dos elementos {cuerpo de argumentos} o una lista de tres elementos {espacio de nombres del cuerpo de argumentos}.
Propiedad universal
Considere una función , es decir, donde la notación de corchetes denota el espacio de las funciones de A a B . Mediante el curry , hay una función única.. Entonces Apply proporciona el morfismo universal.
- ,
así que eso
o, de manera equivalente, uno tiene el diagrama de desplazamiento
Más precisamente, curry y aplicar son functores adjuntos .
La notación porque el espacio de funciones de A a B ocurre más comúnmente en la informática. En la teoría de categorías , sin embargo,se conoce como el 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, estos no son lo mismo, con eval se distingue 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, así que eso está escrito para curry ( g ). Esta notación está en conflicto con el uso deen cálculo lambda , donde lambda se usa para denotar variables ligadas. Con todos estos cambios de notación contabilizados, la contigüidad de Apply y curry se expresa en el diagrama de desplazamiento.
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 conjunción de curry y apply se conoce como adjunción tensor-hom .
Propiedades topologicas
En teoría de órdenes , en la categoría de órdenes parciales completas dotadas de la topología de Scott , tanto curry como apply son funciones continuas (es decir, son Scott continuas ). [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 el espacio de funciones continuas desde a se le da la topología abierta compacta , yes Hausdorff localmente compacto . Este resultado es muy importante, ya que sustenta la teoría de la homotopía, permitiendo entender las deformaciones homotópicas como trayectorias continuas en el espacio de funciones.
Referencias
- ^ Harold Abelson, Gerald Jay Sussman, Julie Sussman, Estructura e interpretación de programas de computadora , (1996) MIT Press, ISBN 0-262-01153-0 . Consulte la Sección 4.1, El evaluador metacircular.
- ^ http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_functions
- ^ "Sintaxis de propagación - JavaScript | MDN" . Consultado el 20 de abril de 2017 .
- ^ "Funciones integradas no esenciales" . Referencia de la biblioteca de Python . 8 de febrero de 2005 . Consultado el 19 de mayo de 2013 .
- ^ "aplicar" . Documentación de tcl . 2006 . Consultado el 23 de junio de 2014 .
- ^ Saunders Mac Lane , Teoría de categorías
- ^ HP Barendregt, El cálculo Lambda , (1984) Holanda Septentrional ISBN 0-444-87508-5