stringtranslate.com

Aplicar

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 .

Programación

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 .

Aplicar función

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.

Common Lisp y Scheme

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

C++

En C++ , Bind [2] se utiliza a través del espacio de nombres std o a través del espacio de nombres boost.

C# y Java

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

Ir

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

Haskell

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.

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:

func .apply ( null , args ) ; 

ES6 agrega el operador de propagació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 ,...)  devolver  f (...) fin

Perl

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

PHP

En PHP , applyse llama call_user_func_array:

call_user_func_array ( 'nombre_función' ,  $args );

Python y Ruby

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]

R

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

Charla informal

En Smalltalk , los objetos de bloque (función) tienen un valueWithArguments:método que toma una matriz de argumentos:

aBlock  valorConArgumentos:  args

Tcl

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

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

Propiedad universal

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

Propiedad universal del objeto exponencial
Propiedad universal del objeto exponencial

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 .

Propiedades topológicas

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.

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 . Véase la sección 4.1, El evaluador metacircular .
  2. ^ "Boost: documentación de Bind.HPP - 1.49.0".
  3. ^ "Sintaxis de propagación - 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 de 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