¿Cuál es la diferencia entre una función y un lambda?

51

Estoy un poco confundido acerca de 'function' 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' pueden usarse indistintamente cuando se habla de objetos en .net. Me pregunto si 'lambda' y 'función' significan lo mismo. 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 que las cosas sean aún más confusas, en .net, las partes funcionales de C # se refieren a las expresiones de función 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?

    
pregunta Rice Flour Cookies 18.01.2012 - 17:33

6 respuestas

41

La palabra "lambda" o "expresiones lambda" generalmente se refiere a funciones anónimas. Entonces, en ese sentido, un lambda es un tipo de función, pero no todas las funciones son un lambda (es decir, las funciones nombradas no suelen denominarse lambdas). Dependiendo del idioma, las funciones anónimas a menudo se implementan de manera diferente a las funciones nombradas (especialmente en idiomas donde las funciones anónimas son cierres y las funciones nombradas no), por lo que hacer referencia a ellas con términos diferentes puede tener sentido.

La diferencia entre la palabra clave lambda del esquema y la palabra clave de la función de Javascript es que la ú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 de programación / modelo matemático de computación mínimo, que utiliza funciones como su única "estructura de datos". En el cálculo lamdba, el símbolo lambda se utiliza para crear funciones (anónimas). Aquí es de donde proviene el uso del término "lambda" en otros idiomas.

    
respondido por el sepp2k 18.01.2012 - 17:52
17

Una lambda es simplemente una función anónima, una función sin nombre.

    
respondido por el Oded 18.01.2012 - 17:51
9

Aquí se responde: enlace

Básicamente, Lambda es una función anónima.

    
respondido por el TWith2Sugars 18.01.2012 - 17:51
7

En C # 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 de delegado sin declaración de método real).

Las expresiones Lambda se pueden desglosar en expresión lambda y sentencia lambda

Expresión lambda:

(int x, string y) => x == y.Length 

La declaración lambda es similar a la expresión lambda, excepto que la (s) declaración (es) se incluyen entre llaves:

(int x, string y) => {
         if (x == y.Length) {
             Console.WriteLine(y);
         }
}

Cuando hablamos de expresiones lambda en JavaScript, básicamente significa utilizar una función como argumento en una llamada a otra función.

var calculate = function(x, y, operation){
    return operation(x, y);
}

// we're passing anonymous function as a third argument
calculate(10, 15, function(x, y) {
    return x + y;
}); // 25
    
respondido por el Christian P 19.01.2012 - 01:03
4

TL; DR Como han señalado otros: la notación lambda es solo una forma de definir funciones sin que se las obligue 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 en el cálculo lambda hace mucho tiempo. Si alguien con mejor conocimiento encuentra alguna inexactitud en mi respuesta, no dude en ayudarme a mejorarla.

Comencemos con expresiones, por ejemplo, 1 + 2 y x + 2 . Los literales como 1 y 2 se llaman constantes porque están vinculados a valores fijos específicos.

Un identificador como x se llama variable y para evaluarla, primero debe vincularlo a algún valor. Por lo tanto, básicamente no puedes evaluar x + 1 mientras no sepas qué es x .

La notación lambda proporciona un esquema para vincular valores de entrada específicos a variables. Una expresión lambda se puede formar agregando λx . delante de una expresión existente, por ejemplo. %código%. Se dice que la variable λx . x + 1 está libre en x y enlazada en x + 1

¿Cómo ayuda esto a evaluar expresiones? Si alimenta un valor a la expresión lambda, de este modo

(λx . x + 1) 2

luego puedes evaluar la expresión completa reemplazando (enlazando) todas las apariciones de la variable λx . x + 1 con el valor 2:

(λx . x + 1) 2
      2 + 1
      3

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 muy diferentes en los lenguajes de programación:

  • En un lenguaje puramente funcional como Haskell, las expresiones lambda representan funciones en el sentido matemático: un valor de entrada se inyecta en el cuerpo de la lambda y se produce un valor de salida.
  • En muchos idiomas (por ejemplo, JavaScript, Python, Scheme), evaluar el cuerpo de una expresión lambda puede tener efectos secundarios. En este caso, se puede usar el término procedimiento para marcar la diferencia entre las funciones puras.

Aparte de las diferencias, la notación lambda trata sobre la definición de parámetros formales y su vinculación con los parámetros reales.

El siguiente paso es dar 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 la función de la siguiente manera:

(define f (lambda (x) (+ x 1)))      ;; Scheme

f = \x -> x + 1                      -- Haskell

val f: (Int => Int) = x => x + 1     // Scala

var f = function(x) { return x + 1 } // JavaScript

f = lambda x: x + 1                  # Python

Como señaló Eli Barzilay, esta definición simplemente vincula el nombre x a un valor, que es una función. Entonces, a este respecto, las funciones, los números, las cadenas y los caracteres son todos valores que pueden vincularse a los nombres de la misma manera:

(define n 42)   ;; Scheme

n = 42          -- Haskell

val n: Int = 42 // Scala

var n = 42      // JavaScript

n = 42          # Python

En estos idiomas, también puede vincular una función a un nombre usando la notación más familiar (pero equivalente):

(define (f x) (+ x 1))         ;; Scheme

f x = x + 1                    -- Haskell

def f(x: Int): Int = x + 1     // Scala

function f(x) { return x + 1 } // JavaScript

def f(x): return x + 1         # Python

Algunos idiomas, por ejemplo, C, solo admite la última notación para definir funciones (nombradas).

Cierros

Algunas observaciones finales sobre cierres . Considera la expresión f . Esto contiene dos variables libres. Si unes x + y usando la notación lambda obtienes:

\x -> x + y

Esto no es (todavía) una función porque todavía contiene una variable libre x . Podrías hacer una función fuera de ella también vinculando y :

\x -> \y -> x + y

o

\x y -> x + y

que es exactamente igual a la función y .

Pero puede vincular, digamos, + de otra manera (*):

incrementBy y = \x -> x + y

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.

Por lo tanto, y es la función (cierre) que incrementa los números en 5.

NOTA (*)

Estoy haciendo trampa un poco aquí:

incrementBy y = \x -> x + y

es equivalente a

incrementBy = \y -> \x -> x + y

por lo que el mecanismo de enlace es el mismo. Intuitivamente, pienso que un cierre representa una parte 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 utiliza más adelante cuando se evalúa / invoca.

    
respondido por el Giorgio 16.10.2015 - 23:17
0

"Lambda" en programación normalmente 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, "función lambda" es un bloque de código (o una expresión) definido en lugar del uso que se puede utilizar como ciudadano de primera clase en un lenguaje de programación.

En JavaScript ES6 (2015) hay una breve sintaxis para definir lambdas llamadas "Funciones de flecha" . En C # tal 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 acerca de la notación de una función (es decir, cómo escribirla), entonces "función lambda" (en cálculo) es un tipo especial de notación de función. Para obtener más información, consulte funciones lambda en lenguajes de programación .

    
respondido por el battlmonstr 21.08.2016 - 12:42

Lea otras preguntas en las etiquetas