stringtranslate.com

Aplicar

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 .

Programación

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 función

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.

Lisp y esquema comunes

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 ))    

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 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 Objectpara 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 )  

Ir

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 ... )   

Haskell

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.

javascript

En JavaScript , los objetos de función tienen un applymétodo, el primer argumento es el valor de la thispalabra 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.

lua

En Lua , aplicar se puede escribir de esta manera:

función  aplicar ( f ,...)  return  f (...) fin

perla

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 ); 

PHP

En PHP , applyse llama call_user_func_array:

call_user_func_array ( 'nombre_func' ,  $args );

pitón y rubí

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]

R

En R , do.callconstruye 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 ))       

Charla

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

tcl

Desde Tcl 8.5, [5] se puede aplicar una función a argumentos con el applycomando

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}.

propiedad universal

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.

Propiedad universal del objeto exponencial.
Propiedad universal del objeto exponencial.

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 .

Propiedades topológicas

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.

Referencias

  1. ^ Harold Abelson, Gerald Jay Sussman, Julie Sussman, Estructura e interpretación de programas informáticos , (1996) MIT Press, ISBN  0-262-01153-0 . Consulte la Sección 4.1, El evaluador metacircular.
  2. ^ "Impulso: documentación de Bind.HPP - 1.49.0".
  3. ^ "Sintaxis extendida: JavaScript | MDN" . Consultado el 20 de abril de 2017 .
  4. ^ "Funciones integradas no esenciales". Referencia de la biblioteca de Python . 8 de febrero de 2005 . Consultado el 19 de mayo de 2013 .
  5. ^ "aplicar". Documentación tcl . 2006 . Consultado el 23 de junio de 2014 .
  6. ^ Saunders Mac Lane , teoría de categorías
  7. ^ HP Barendregt, The Lambda Calculus , (1984) Holanda Septentrional ISBN 0-444-87508-5