Estoy un poco confundido acerca de 'función' y 'lambda'. He visto algunos ejemplos que muestran que la palabra clave de esquema lambda
funciona de manera muy similar a la palabra clave de JavaScript function
, pero realmente no sé cómo se relacionan.
Me dicen que 'función' y 'método' se pueden usar indistintamente cuando se habla de objetos en .net. Me pregunto si 'lambda' y 'función' significan lo mismo de manera similar. Me pregunto si 'lambda' tiene algún significado esotérico, ya que la letra griega lambda (λ) aparece en tantos avatares en este sitio. Para hacer las cosas aún más confusas, en .net, las partes funcionales de C # se refieren a expresiones de funciones pasadas a otra función como 'expresiones lambda', por lo que la palabra realmente parece estar por todas partes.
También estoy vagamente familiarizado con el término 'cálculo lambda'.
¿Cuál es la diferencia entre una función y una lambda?
fuente
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.
Uno esperaría que fuera en referencia al cálculo lambda, pero tengo la extraña sensación de que Half Life es el culpable de los avatares lambda.Respuestas:
La palabra "lambda" o "expresiones lambda" con mayor frecuencia se refiere a funciones anónimas. Entonces, en ese sentido, una lambda es un tipo de función, pero no todas las funciones son una lambda (es decir, las funciones nombradas generalmente no se denominan lambdas). Dependiendo del idioma, las funciones anónimas a menudo se implementan de manera diferente a las funciones con nombre (particularmente en idiomas donde las funciones anónimas son clausuras y las funciones con nombre no lo son), por lo que hacer referencia a ellas con diferentes términos puede tener sentido.
La diferencia entre la palabra clave lambda del esquema y la palabra clave de función de Javascript es que esta última se puede usar para crear funciones anónimas y funciones con nombre, mientras que la primera solo crea funciones anónimas (y usaría
define
para crear funciones con nombre).El cálculo lambda es un lenguaje mínimo de programación / modelo matemático de computación, que utiliza funciones como su única "estructura de datos". En el cálculo lamdba, el símbolo lambda se usa para crear funciones (anónimas). De aquí proviene el uso del término "lambda" en otros idiomas.
fuente
define
(olet
uno de sus parientes, o una definición interna) para crear nombres, eso es todo. No hay nada especialdefine
con respecto a las funciones.define
sí tienen una forma especial para la definición de funciones (es decir, se puede escribir(define (f x) (foo))
en lugar de(define f (lambda (x) (foo)))
), pero mi punto es que no se puede crear una función llamada usandolambda
solo, es decir, que es posible que algo no escribir como(lambda f (x) (foo))
para definir una función llamadaf
eso toma un argumento como puedes con lafunction
palabra clave de Javascript .define
tiene eso como un azúcar sintáctico, por lo que no es tan importante como su función como herramienta de enlace de nombres para todos los valores. En cuanto alambda
no crear un nombre por sí mismo: esa es una característica importante, ya que separa los nombres de las formas de función ... IMO JS está haciendo lo correcto al permitir la separación y al mismo tiempo acepta un nombre opcional para aquellas masas que estarían horrorizadas por La idea de una función sin nombre. (Y afortunadamente el tamaño de esas masas está en una disminución general ...)Una lambda es simplemente una función anónima, una función sin nombre.
fuente
lambda
expresión en Scheme es como unafunction
expresión sin nombre, pero no hay nada que te impida luego darles un nombre. Por ejemplovar f = [function(x){return x;}][0]
. Se podría argumentar que el valor de la función en sí no tiene nombre, pero eso sería cierto para todas las funciones ...Respondido aquí: https://stackoverflow.com/questions/16501/what-is-a-lambda-function
Básicamente Lambda es una función anónima.
fuente
En C #, la función anónima es un término general que incluye expresiones lambda y métodos anónimos (los métodos anónimos son instancias delegadas sin declaración de método real).
Las expresiones lambda se pueden dividir en expresión lambda y declaración lambda
Expresión lambda:
La declaración lambda es similar a la expresión lambda, excepto que las declaraciones están encerradas entre llaves:
Cuando hablamos de expresiones lambda en JavaScript, eso básicamente significa usar una función como argumento en una llamada a otra función.
fuente
TL; DR Como otros señalaron: la notación lambda es solo una forma de definir funciones sin verse obligado a darles un nombre.
Versión larga
Me gustaría elaborar un poco sobre este tema porque me parece muy interesante. Descargo de responsabilidad: he tomado mi curso sobre cálculo lambda hace mucho tiempo. Si alguien con mejor conocimiento encuentra alguna imprecisión en mi respuesta, siéntase libre de ayudarme a mejorarla.
Comencemos con expresiones, por ejemplo,
1 + 2
yx + 2
. Los literales como1
y2
se llaman constantes porque están vinculados a valores fijos específicos.Un identificador como
x
se llama variable y para evaluarlo primero debe vincularlo a algún valor. Entonces, básicamente no puedes evaluarx + 1
mientras no sepas quéx
es.La notación lambda proporciona un esquema para vincular valores de entrada específicos a variables. Se puede formar una expresión lambda agregando
λx .
delante de una expresión existente, por ejemploλx . x + 1
. Variablex
se dice que es libre enx + 1
y con destino enλx . x + 1
¿Cómo ayuda esto a evaluar expresiones? Si alimenta un valor a la expresión lambda, así
entonces puede evaluar la expresión completa reemplazando (vinculando) todas las apariciones de la variable
x
con el valor 2:Entonces, la notación lambda proporciona un mecanismo general para vincular cosas a variables que aparecen en un bloque de expresión / programa. Dependiendo del contexto, esto crea conceptos visualmente diferentes en los lenguajes de programación:
Además de las diferencias, la notación lambda se trata de definir parámetros formales y vincularlos a parámetros reales.
El siguiente paso es darle un nombre a una función / procedimiento. En varios idiomas, las funciones son valores como cualquier otro, por lo que puede asignar un nombre a una función de la siguiente manera:
Como señaló Eli Barzilay, esta definición solo une el nombre
f
a un valor, que resulta ser una función. Entonces, a este respecto, las funciones, números, cadenas, caracteres son todos valores que pueden vincularse a los nombres de la misma manera:En estos idiomas también puede vincular una función a un nombre utilizando la notación más familiar (pero equivalente):
Algunos lenguajes, por ejemplo, C, solo admiten la última notación para definir funciones (con nombre).
Cierres
Algunas observaciones finales sobre cierres . Considera la expresión
x + y
. Este contiene dos variables libres. Si te unesx
usando la notación lambda obtienes:Esto no es (todavía) una función porque todavía contiene una variable libre
y
. También puede hacer una función al vincularloy
:o
que es lo mismo que la
+
función.Pero puede vincular, por ejemplo,
y
de otra manera (*):El resultado de aplicar la función incrementBy a un número es un cierre, es decir, una función / procedimiento cuyo cuerpo contiene una variable libre (por ejemplo
y
) que se ha vinculado a un valor del entorno en el que se definió el cierre.Así
incrementBy 5
es la función (cierre) que incrementa los números en 5.NOTA (*)
Estoy engañando un poco aquí:
es equivalente a
entonces el mecanismo de enlace es el mismo. Intuitivamente, pienso en un cierre como la representación de un trozo de una expresión lambda más compleja. Cuando se crea esta representación, algunos de los enlaces de la expresión madre ya se han establecido y el cierre los usa más tarde cuando se evalúa / invoca.
fuente
"Lambda" en programación generalmente significa "función lambda" (o también "expresión lambda", "término lambda"). Cuando la función es un bloque de código con nombre definido antes de su uso, la "función lambda" es un bloque de código (o una expresión) definido en lugar del uso que se puede usar como ciudadano de primera clase en un lenguaje de programación.
En JavaScript ES6 (2015) hay una sintaxis corta para definir lambdas llamada "Funciones de flecha" . En C #, dicha sintaxis se introdujo en .NET 3.0 (alrededor de 2006) .
En matemáticas, una noción de "función" tiene varios significados donde uno de los significados es sobre la notación de una función (es decir, cómo escribirla), luego la "función lambda" (en cálculo) es un tipo especial de notación de función. Para más discusión, verifique las funciones lambda en lenguajes de programación .
fuente