Articulo de referencia

Función anónima

En programación informática , una función anónima ( literal de función , función lambda o bloque ) es una definición de función que no está vinculada a un identificador . Las fu...

En programación informática , una función anónima ( literal de función , función lambda o bloque ) es una definición de función que no está vinculada a un identificador . Las funciones anónimas suelen ser argumentos que se pasan a funciones de orden superior o se utilizan para construir el resultado de una función de orden superior que necesita devolver una función. [ 1 ] Si la función se usa solo una vez, o un número limitado de veces, una función anónima puede ser sintácticamente más ligera que usar una función con nombre. Las funciones anónimas son omnipresentes en los lenguajes de programación funcional y otros lenguajes con funciones de primera clase , donde cumplen el mismo rol para el tipo de función que los literales para otros tipos de datos .

Las funciones anónimas tienen su origen en el trabajo de Alonzo Church y su invención del cálculo lambda , en el que todas las funciones son anónimas, en 1936, antes de la llegada de las computadoras electrónicas. [ 2 ] En varios lenguajes de programación, las funciones anónimas se introducen mediante la palabra clave `lambda` , y a menudo se las denomina lambdas o abstracciones lambda . Las funciones anónimas han sido una característica de los lenguajes de programación desde Lisp en 1958, y un número creciente de lenguajes de programación modernos las admiten.

Nombres

Los nombres "abstracción lambda", "función lambda" y "expresión lambda" se refieren a la notación de abstracción de funciones en el cálculo lambda, donde la función usualF(incógnita)=METRO{\displaystyle f(x)=M}estaría escrito(λincógnita.METRO){\displaystyle (\lambda xM)}y dóndeMETRO{\displaystyle M}es una expresión que utilizaincógnita{\displaystyle x}. Compárese con la sintaxis de Python de .lambdax:M

El nombre "función flecha" se refiere al símbolo matemático " mapea a ",incógnitaMETRO{\displaystyle x\mapsto M}. Compárese con la sintaxis de JavaScript de . [ 3 ]x=>M

Usos

Las funciones anónimas pueden encapsular funcionalidades que no requieren ser nombradas y están destinadas a un uso a corto plazo o localizado. Algunos ejemplos notables incluyen cierres y currificación .

El uso de funciones anónimas es una cuestión de estilo. Nunca son la única forma de resolver un problema; cada función anónima podría definirse como una función con nombre y llamarse por su nombre. Las funciones anónimas suelen ofrecer una notación más breve que la definición de funciones con nombre. En lenguajes que no permiten la definición de funciones con nombre en ámbitos locales, las funciones anónimas pueden proporcionar encapsulación mediante un ámbito localizado; sin embargo, el código dentro del cuerpo de dichas funciones anónimas puede no ser reutilizable ni apto para pruebas independientes. Las funciones anónimas cortas y sencillas utilizadas en expresiones pueden ser más fáciles de leer y comprender que las funciones con nombre definidas por separado, aunque la falta de un nombre descriptivo puede reducir la legibilidad del código.

En algunos lenguajes de programación, las funciones anónimas se implementan comúnmente para propósitos muy específicos, como vincular eventos a funciones de devolución de llamada o instanciar la función para valores particulares, lo que puede ser más eficiente en un lenguaje de programación dinámico , más legible y menos propenso a errores que llamar a una función con nombre.

Los siguientes ejemplos están escritos en Python 3.

Clasificación

Muchos lenguajes de programación ofrecen una función genérica que ordena una lista (o matriz) de objetos según un criterio determinado por una función de comparación. Esta función compara dos objetos para determinar si son iguales o si uno es mayor o menor que el otro. Utilizar una expresión de función de comparación anónima, pasada como argumento a una función de ordenación genérica, suele ser más conciso que crear una función de comparación con nombre.

Consideremos este código Python que ordena una lista de cadenas por la longitud de la cadena:

a : lista [ str ] = [ "casa" , "coche" , "bicicleta" ] a . ordenar ( clave = lambda x : len ( x )) imprimir ( a ) # imprime ['coche', 'bicicleta', 'casa']

La función anónima en este ejemplo es la expresión lambda:

lambda x : longitud ( x )

La función anónima acepta un argumento xy devuelve la longitud de dicho argumento, que luego es utilizada por el sort()método como criterio de ordenación.

La sintaxis básica de una función lambda en Python es

lambda arg1 , arg2 , arg3 , ... : < operación sobre los argumentos que devuelve un valor >

La expresión devuelta por la función lambda se puede asignar a una variable y utilizarse en el código en varios lugares.

from typing import Callableagregar : Callable [[ int ], int ] = lambda a : a + a print ( add ( 20 )) # imprime 40

Otro ejemplo sería ordenar los elementos de una lista por el nombre de su clase (en Python, todo tiene una clase):

a : lista [ int | str ] = [ 10 , "número" , 11.2 ] a . ordenar ( clave = lambda x : x . __clase__ . __nombre__ ) imprimir ( a ) # imprime [11.2, 10, 'número']

Tenga en cuenta que 11.2tiene el nombre de clase " float", 10tiene el nombre de clase " int", y 'number'tiene el nombre de clase " str". El orden ordenado es " float", " int", luego " str".

Cierres

Las clausuras son funciones que se evalúan en un entorno que contiene variables vinculadas . El siguiente ejemplo vincula la variable "umbral" dentro de una función anónima que compara los valores de entrada con este umbral.

def comp ( umbral : int ) -> Callable [[ int ], bool ]: return lambda x : x < umbral

Esto puede utilizarse como una especie de generador de funciones de comparación:

func_a : Callable [[ int ], bool ] = comp ( 10 ) func_b : Callable [[ int ], bool ] = comp ( 20 )print ( func_a ( 5 ), func_a ( 8 ), func_a ( 13 ), func_a ( 21 )) # imprime True True False Falseprint ( func_b ( 5 ), func_b ( 8 ), func_b ( 13 ), func_b ( 21 )) # imprime True True True False

Sería poco práctico crear una función para cada posible función de comparación y podría resultar demasiado engorroso mantener el umbral para su uso posterior. Independientemente del motivo por el que se utilice un cierre, la función anónima es la entidad que contiene la funcionalidad que realiza la comparación.

Zurra

El currying transforma una función que acepta múltiples argumentos en una secuencia de funciones, cada una de las cuales acepta un único argumento. En este ejemplo, una función que realiza la división por cualquier número entero se transforma en una que realiza la división por un número entero determinado.

def divide ( x : int , y : int ) -> float : return x / ydef divisor ( d : int ) -> Callable [[ int ], float ]: return lambda x : divide ( x , d )mitad : Invocable [[ int ], float ] = divisor ( 2 ) tercero : Invocable [[ int ], float ] = divisor ( 3 )imprimir ( mitad ( 32 ), tercio ( 32 )) # imprime 16.0 10.666666666666666imprimir ( mitad ( 40 ), tercio ( 40 )) # imprime 20.0 13.333333333333334

Aunque el uso de funciones anónimas no sea común en la currificación, aún es posible. En el ejemplo anterior, la función `divisor` genera funciones con un divisor especificado. Las funciones `half` y `third` currifican la función `divide` con un divisor fijo.

La función divisora ​​también forma un cierre al vincular la variable d.

Funciones de orden superior

Una función de orden superior es aquella que recibe otra función como argumento o devuelve una como resultado. Esta técnica se utiliza frecuentemente para personalizar el comportamiento de una función definida genéricamente, como un bucle o un patrón de recursión. Las funciones anónimas son una forma práctica de especificar dichos argumentos. Los siguientes ejemplos están en Python 3.

Mapa

La función map realiza una llamada a otra función en cada elemento de una lista. El siguiente ejemplo eleva al cuadrado cada elemento de un array mediante una función anónima.

a : lista [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ( lista ( mapa ( lambda x : x * x , a ))) # imprime [1, 4, 9, 16, 25, 36]

La función anónima toma un argumento y devuelve su cuadrado. Los creadores del lenguaje desaconsejan la forma anterior, ya que sostienen que la forma que se presenta a continuación tiene el mismo significado y se ajusta mejor a la filosofía del lenguaje:

a : lista [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ([ x * x for x in a ]) # imprime [1, 4, 9, 16, 25, 36]

Filtrar

La función de filtro devuelve todos los elementos de una lista que se evalúan como verdaderos cuando se pasan a una función determinada.

a : lista [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ( lista ( filtro ( lambda x : x % 2 == 0 , a ))) # imprime [2, 4, 6]

La función anónima comprueba si el argumento que se le pasa es par. Al igual que con map, la siguiente forma se considera más apropiada:

a : lista [ int ] = [ 1 , 2 , 3 , 4 , 5 , 6 ] print ([ x for x in a if x % 2 == 0 ]) # imprime [2, 4, 6]

Doblar

Una función de plegado recorre todos los elementos de una estructura (para listas, generalmente de izquierda a derecha, se denomina "pliegue izquierdo" reduceen Python), acumulando un valor a medida que avanza. Esto se puede utilizar para combinar todos los elementos de una estructura en un solo valor, por ejemplo:

a : lista [ int ] = [ 1 , 2 , 3 , 4 , 5 ] print ( functools . reduce ( lambda x , y : x * y , a )) # imprime 120

Esto funciona

(((1×2)×3)×4)×5=120.{\displaystyle \left(\left(\left(1\times 2\right)\times 3\right)\times 4\right)\times 5=120.}

La función anónima en este caso es la multiplicación de los dos argumentos.

Una operación de plegado no necesariamente produce un único valor escalar; también puede generar resultados estructurados, como listas. De hecho, tanto el mapeo como el filtrado pueden crearse mediante plegado. En el mapeo, el valor acumulado es una nueva lista que contiene el resultado de aplicar una función a cada elemento de la lista original. En el filtrado, el valor acumulado es una nueva lista que contiene solo aquellos elementos que coinciden con la condición dada.

Lista de idiomas

La siguiente es una lista de lenguajes de programación que admiten funciones anónimas sin nombre de forma total, parcial como alguna variante o que no las admiten en absoluto.

La siguiente tabla ilustra varios patrones comunes. Cabe destacar que lenguajes como C , Pascal y Object Pascal —que tradicionalmente no admiten funciones anónimas— son lenguajes de tipado estático . Sin embargo, los lenguajes de tipado estático pueden admitir funciones anónimas. Por ejemplo, los lenguajes ML son de tipado estático e incluyen funciones anónimas de forma fundamentalmente, y Delphi , un dialecto de Object Pascal , se ha extendido para admitir funciones anónimas, al igual que C++ (mediante el estándar C++11 ). En segundo lugar, los lenguajes que tratan las funciones como funciones de primera clase ( Dylan , Haskell , JavaScript , Lisp , ML , Perl , Python , Ruby , Scheme ) generalmente admiten funciones anónimas, de modo que las funciones se pueden definir y pasar con la misma facilidad que otros tipos de datos.

Ejemplos

Véase también

Referencias

  1. "Funciones de orden superior" . learnyouahaskell.com . Consultado el 3 de diciembre de 2014 .
  2. Fernández, Maribel (2009), Modelos de computación: Una introducción a la teoría de la computabilidad , Temas de pregrado en informática, Springer Science & Business Media, pág. 33, ISBN  9781848824348El cálculo lambda... fue introducido por Alonzo Church en la década de 1930 como una notación precisa para una teoría de funciones anónimas.
  3. "Expresiones de función flecha - JavaScript" . MDN . Consultado el 21 de agosto de 2019 .
  4. "Tipos de acceso" . www.adaic.org . Consultado el 27 de junio de 2024 .
  5. "Bash lambda" . GitHub . 8 de marzo de 2019.
  6. BillWagner. "Expresiones Lambda - Referencia de C#" . docs.microsoft.com . Consultado el 24 de noviembre de 2020 .
  7. "Apoyo al cierre" . Archivado del original el 6 de enero de 2014. Consultado el 5 de enero de 2014 .
  8. "Novedades de ColdFusion 10" . Archivado del original el 6 de enero de 2014. Consultado el 5 de enero de 2014 .
  9. "Clojure - Funciones de orden superior" . clojure.org . Consultado el 14 de enero de 2022 .
  10. "Manual de referencia de COBOL gestionado" . Documentación de Micro Focus . Micro Focus . Consultado el 25 de febrero de 2014 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  11. "Funciones - Lenguaje de programación D" . dlang.org . Consultado el 14 de enero de 2022 .
  12. "Un recorrido por el lenguaje Dart" . dart.dev . Consultado el 24 de noviembre de 2020 .
  13. "Métodos anónimos en Delphi - RAD Studio" . docwiki.embarcadero.com . Consultado el 24 de noviembre de 2020 .
  14. "Funciones — Programación Dylan" . opendylan.org . Consultado el 14 de enero de 2022 .
  15. "docs/syntax" . elm-lang.org . Consultado el 14 de enero de 2022 .
  16. "Sintaxis de Erlang/Elixir: Un curso intensivo" . elixir-lang.github.com . Consultado el 24 de noviembre de 2020 .
  17. "Erlang -- Diversión" . erlang.org . Consultado el 24 de noviembre de 2020 .
  18. cartermp. "Expresiones Lambda: La divertida palabra clave - F#" . docs.microsoft.com . Consultado el 24 de noviembre de 2020 .
  19. "LAMBDA: La función definitiva para hojas de cálculo de Excel" . microsoft.com . 25 de enero de 2021. Consultado el 30 de marzo de 2021 .
  20. "Citas - Documentación de factores" . Consultado el 26 de diciembre de 2015. Una cita es una función anónima (un valor que denota un fragmento de código) que puede usarse como valor y llamarse mediante los combinadores fundamentales.
  21. "Frink" . frinklang.org . Consultado el 24 de noviembre de 2020 .
  22. "Funciones anónimas en GoLang" . Documentación de GoLang . 9 de enero de 2020. Consultado el 24 de noviembre de 2020 .
  23. "Documentación de Gosu" (PDF) . Consultado el 4 de marzo de 2013 .
  24. "Documentación genial" . Archivado del original el 22 de mayo de 2012. Consultado el 29 de mayo de 2012 .
  25. "Función anónima - HaskellWiki" . wiki.haskell.org . Consultado el 14 de enero de 2022 .
  26. "Lambda" . Haxe - El kit de herramientas multiplataforma . Consultado el 14 de enero de 2022 .
  27. "Funciones - JavaScript | MDN" . developer.mozilla.org . Consultado el 14 de enero de 2022 .
  28. "Funciones · El lenguaje Julia" . docs.julialang.org . Consultado el 24 de noviembre de 2020 .
  29. "Funciones de orden superior y lambdas - Lenguaje de programación Kotlin" . Kotlin . Consultado el 24 de noviembre de 2020 .
  30. "Programación en Lua : 6" . www.lua.org . Consultado el 24 de noviembre de 2020 . 
  31. "Programación en Maple: 1.6: Funciones y expresiones anónimas - Centro de aplicaciones" . www.maplesoft.com . Consultado el 24 de noviembre de 2020 .
  32. "Funciones anónimas - MATLAB y Simulink" . www.mathworks.com . Consultado el 14 de enero de 2022 .
  33. "Manual de Maxima 5.17.1: 39. Definición de función" . maths.cnam.fr . Consultado el 24/11/2020 .
  34. "Manual de Nim" . nim-lang.github.io .
  35. "Ejemplos de código – OCaml" . ocaml.org . Consultado el 24 de noviembre de 2020 .
  36. "GNU Octave: Funciones anónimas" . octave.org . Consultado el 24 de noviembre de 2020 .
  37. "Literales de función" . Manual de usuario de OpenSCAD . Wikibooks . Consultado el 22 de febrero de 2021 .
  38. "perlsub - Subrutinas de Perl - Navegador de Perldoc" . perldoc.perl.org . Consultado el 24 de noviembre de 2020 .
  39. "PHP: Funciones anónimas - Manual" . www.php.net . Consultado el 24 de noviembre de 2020 .
  40. "6. Expresiones — Documentación de Python 3.9.0" . docs.python.org . Consultado el 24 de noviembre de 2020 .
  41. "4.4 Funciones: lambda" . docs.racket-lang.org . Consultado el 24/11/2020 .
  42. "Funciones" . docs.raku.org . Consultado el 14 de enero de 2022 .
  43. Sosinski, Robert (21 de diciembre de 2008). "Understanding Ruby Blocks, Procs and Lambdas" . Reactive.IO. Archivado del original el 31 de mayo de 2014. Recuperado el 30 de mayo de 2014 .
  44. "Cierres: funciones anónimas que pueden capturar su entorno - El lenguaje de programación Rust" . doc.rust-lang.org . Consultado el 14 de enero de 2022 .
  45. "Funciones anónimas" . Documentación de Scala . Consultado el 14 de enero de 2022 .
  46. "Recitación 3: Funciones de orden superior" . www.cs.cornell.edu . Consultado el 14 de enero de 2022 .
  47. "Cierres — El lenguaje de programación Swift (Swift 5.5)" . docs.swift.org .
  48. "Documentación - Tipos cotidianos" . www.typescriptlang.org . Consultado el 14 de enero de 2022 .
  49. "Tipo de función - Documentación de Typst" . typst.app . Consultado el 10 de septiembre de 2024 .
  50. 1 2 "Proyectos/Vala/Tutorial - ¡GNOME Wiki!" . wiki.gnome.org . Consultado el 24-11-2020 .
  51. KathleenDollard (15 de septiembre de 2021). "Expresiones Lambda - Visual Basic" . docs.microsoft.com . Consultado el 14 de enero de 2022 .
  52. "Referencia de lenguaje/Términos/Predicados anónimos - wiki.visual-prolog.com" . wiki.visual-prolog.com . Consultado el 14 de enero de 2022 .
  53. "Función anónima pura: Introducción elemental al lenguaje Wolfram" . www.wolfram.com . Consultado el 14 de enero de 2022 .
  54. "Lambdas, Closures y todo lo demás · Problema n.° 1048 · ziglang/zig" . GitHub . Consultado el 21 de agosto de 2023 .
  • Métodos anónimos: ¿cuándo deben usarse? (blog sobre funciones anónimas en Delphi)
  • Compilación de expresiones Lambda: Scala vs. Java 8
  • funciones anónimas de php funciones anónimas de php
  • Funciones Lambda en varios lenguajes de programación
  • Funciones en Go