¿Qué es una Lambda?

93

¿Alguien podría proporcionar una buena descripción de lo que es un Lambda? Tenemos una etiqueta para ellos y están en los secretos de la pregunta C #, pero todavía tengo que encontrar una buena definición y explicación de lo que son en primer lugar.

Fred
fuente
1
¿Qué tal el artículo de cálculo lambda de Wikipedia para empezar? Luego, el artículo de programación funcional de Wikipedia como seguimiento.
Thorsten79
2
posible duplicado de ¿Qué es una lambda (función)?
nawfal
Expresión de amda explicada aquí maravillosamente.
Jameer Mulani

Respuestas:

135

Los cierres, lambdas y funciones anónimas no son necesariamente lo mismo.

Una función anónima es cualquier función que no tiene (o, al menos, necesita) su propio nombre.

Un cierre es una función que puede acceder a variables que estaban en su alcance léxico cuando fue declarada, incluso después de que hayan caído fuera de alcance. Las funciones anónimas no tienen por qué ser cierres, pero están en la mayoría de los idiomas y se vuelven menos útiles cuando no lo son.

Una lambda no está tan bien definida en lo que respecta a la informática. Muchos idiomas ni siquiera usan el término; en su lugar, simplemente los llamarán cierres o funciones anónimas o inventarán su propia terminología. En LISP, una lambda es solo una función anónima. En Python, una lambda es una función anónima limitada específicamente a una sola expresión; algo más, y necesita una función con nombre. Las lambdas son cierres en ambos idiomas.

Eevee
fuente
el término podría estar destinado a implicar el cálculo lambda en.wikipedia.org/wiki/Lambda_calculus
Steven A. Lowe
Wow, tuve más de un voto a favor para dar esta pregunta. He visto tantas respuestas técnicas empantanadas en terminología, pero esta es concisa y lo explica de inmediato.
Matthew Stopa
8
+1 por no usar el término "cerrar sobre" para definir un cierre como si lo aclarara más.
Daniel
5
Una región donde puede existir alguna variable (es decir, un ámbito) definida por la estructura de su código (es decir, léxicamente). Por ejemplo, en la mayoría de los lenguajes, una función define un ámbito léxico; cualquier variable declarada dentro de la función es inaccesible fuera de ella.
Eevee
19

También llamados cierres o funciones anónimas ... Encontré la mejor descripción aquí . Básicamente, bloque de código en línea que se puede pasar como argumento a una función.

Gulzar Nazim
fuente
8

Es solo una función anónima declarada en línea, generalmente asignada a un delegado cuando no desea escribir una función completa.

En lenguajes como lisp / esquema, a menudo se pasan de manera bastante generosa como parámetros de función, pero el idioma en C # generalmente encuentra lambdas que se usan solo para la evaluación perezosa de funciones, como en linq, o para hacer que el código de manejo de eventos sea un poco más terso.

JasonTrue
fuente
5

Realmente no existe tal cosa como 'lambda' en programación. Depende del idioma, etc.

En resumen, normalmente un lenguaje que 'tiene lambdas' usa el término para funciones anónimas o, en algunos casos, cierres. Así, en Ruby:

f = lambda { return "this is a function with no name" }
puts f.call
rfunduk
fuente
4

En respuesta a las respuestas anteriores:
-Lo importante de las funciones anónimas no es que no requieran un nombre.
-Los cierres son un concepto aparte.
-Un artículo gigantesco de Wikipedia no aclara esto.

Aquí está mi respuesta en 3 partes:
1. Una lambda es una función que también es una expresión. Eso es lo importante.
2. Muchos lenguajes que implementan las llamadas "lambdas" agregan algo de azúcar sintáctico para hacer que escribir estas funciones cortas sea más fácil y rápido, pero esto no es necesario.
3. Algunos idiomas pueden requerir que una lambda no tenga efectos secundarios . Esa sería una lambda más pura en el sentido funcional.

Cuando una función es una expresión, es un "ciudadano de primera clase" dentro del lenguaje. Puedo hacer todas las cosas importantes con él:

x = lambda(){ return "Hello World"; }

doit( 1, 2, lambda(a,b){ return a > b; }, 3 )

x = (lambda(a){ return a+1; }) + 5  // type error, not syntax error

(lambda(a,b){ print(a); log(b); })( 1, 2 )  // () is valid operator here
cmeub
fuente
1

Recortado de wikipedia: http://en.wikipedia.org/wiki/Lambda#Lambda.2C_the_word

En lenguajes de programación como Lisp y Python, lambda es un operador utilizado para denotar funciones o cierres anónimos, siguiendo el uso del cálculo lambda.

Malla
fuente
Supongo que se refería a esta línea: en lenguajes de programación como Lisp y Python, lambda es un operador que se usa para denotar funciones o cierres anónimos, siguiendo el uso del cálculo lambda. Ya había escaneado el artículo, pero me lo perdí.
Fred