Qual é a diferença entre uma função e uma lambda?


54

Estou um pouco confuso sobre 'function' e 'lambda'. Eu já vi alguns exemplos mostrando que a palavra-chave do esquema lambdafunciona de maneira muito semelhante à palavra-chave JavaScript function, mas eu realmente não sei como elas estão relacionadas.

Disseram-me que 'function' e 'method' podem ser usados ​​de forma intercambiável quando se fala de objetos em .net. Gostaria de saber se 'lambda' e 'function' da mesma forma significam a mesma coisa. Gostaria de saber se 'lambda' tem algum significado esotérico, visto que a letra grega lambda (λ) aparece em tantos avatares neste site. Para tornar as coisas ainda mais confusas, no .net, as partes funcionais do C # se referem às expressões de função passadas para outra função como 'expressões lambda', de modo que a palavra realmente parece estar em todo lugar.

Também estou vagamente familiarizado com o termo 'cálculo lambda'.

Qual é a diferença entre uma função e uma lambda?


3
Nitpick - eles são chamados de "expressões lambda", não "funções lambda", pelo menos no que diz respeito à documentação do C # / .NET.
Oded

@ TWith2Sugars - Leia a mensagem. Sua resposta é de baixa qualidade, pois praticamente é apenas um link, então foi convertida em um comentário.
Oded

17
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.Seria de se esperar que isso se referisse ao cálculo lambda, mas tenho uma estranha sensação de que Half Life é o culpado pelos avatares lambda.
precisa saber é

3
Fair o suficiente, aqui está o link para a resposta stackoverflow: stackoverflow.com/questions/16501/what-is-a-lambda-function
TWith2Sugars

@ZaphodBeeblebrox: Eu suspeito que você esteja certo sobre a influência da Half-Life. : /
FrustratedWithFormsDesigner

Respostas:


44

A palavra "lambda" ou "expressões lambda" geralmente se refere a funções anônimas. Portanto, nesse sentido, um lambda é um tipo de função, mas nem toda função é um lambda (ou seja, funções nomeadas geralmente não são chamadas de lambdas). Dependendo do idioma, as funções anônimas geralmente são implementadas de forma diferente das funções nomeadas (principalmente nos idiomas em que as funções anônimas são fechadas e as funções nomeadas não são), portanto, fazer referência a elas com termos diferentes pode fazer sentido.

A diferença entre a palavra-chave lambda do esquema e a palavra-chave da função Javascript é que a última pode ser usada para criar funções anônimas e funções nomeadas, enquanto a primeira cria apenas funções anônimas (e você usaria definepara criar funções nomeadas).

O cálculo lambda é uma linguagem de programação mínima / modelo matemático de computação, que utiliza funções como sua única "estrutura de dados". No cálculo lamdba, o símbolo lambda é usado para criar funções (anônimas). É daí que vem o uso do termo "lambda" em outros idiomas.


11
Isso é extremamente difícil. Você usa define(ou letum de seus parentes ou uma definição interna) para criar nomes - isso é tudo. Não há nada de especial em definerelação às funções.
Eli Barzilay

2
@EliBarzilay Bem, define faz tem uma forma especial para a definição de funções (ou seja, você pode escrever (define (f x) (foo))em vez de (define f (lambda (x) (foo)))), mas o meu ponto é que você não pode criar uma função chamada usando lambdasozinho, ou seja, você pode algo que não escrever como (lambda f (x) (foo))para definir uma função chamada fisso requer um argumento como você pode com a functionpalavra-chave Javascript .
sepp2k

11
definetem isso como um açúcar sintático, por isso não é tão importante quanto seu papel como uma ferramenta de vinculação de nomes para todos os valores. Quanto a lambdanão criar um nome por si só: esse é um recurso importante, pois separa a criação de nomes dos formulários de função ... O IMO JS está fazendo a coisa certa ao permitir a separação, ao mesmo tempo em que aceita um nome opcional para as massas que ficariam horrorizadas com o fato. a ideia de uma função sem nome. (E felizmente o tamanho dessas massas estão em um declínio geral ...)
Eli Barzilay

18

Um lambda é simplesmente uma função anônima - uma função sem nome.


4
Nota Bastante: os lambda podem conter o estado (como no fechamento) que eles se prendem ao contexto em que são declarados.
Martin York

7
O mesmo poderia acontecer com uma função nomeada, se o idioma permitir que você declare funções aninhadas.
cHao

4
Parabéns por entrar na guia de revisão "postagens de baixa qualidade" com uma resposta votada.
yannis

@ZaphodBeeblebrox - Não intencionalmente, posso garantir.
Oded

Na verdade, uma lambdaexpressão em Scheme é como uma functionexpressão sem nome - mas não há nada que o impeça de dar um nome a eles mais tarde. Por exemplo var f = [function(x){return x;}][0]. Você poderia argumentar que o próprio valor da função não tem nome, mas isso seria verdade para todas as funções ...
Eli Barzilay


8

Em C #, função anônima é um termo geral que inclui expressões lambda e métodos anônimos (métodos anônimos são instâncias delegadas sem nenhuma declaração de método real).

Expressões lambda podem ser divididas em expressão lambda e instrução lambda

Expressão lambda:

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

A instrução lambda é semelhante à expressão lambda, exceto que as instruções estão entre colchetes:

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

Quando falamos sobre expressões lambda em JavaScript, isso basicamente significa apenas usar uma função como argumento em uma chamada para outra função.

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

+1 Muitas pessoas mencionaram que lambdas são funções anônimas, mas há mais do que isso. O corpo (lado direito) de um lambda geralmente é uma expressão e não um bloco de instruções. O corpo de uma função nomeada sendo uma expressão é normalmente permitido (ou obrigatório) em linguagens funcionais, mas não em linguagens imperativas.
Zantier 27/07

4

TL; DR Como outros apontaram: a notação lambda é apenas uma maneira de definir funções sem ser forçado a dar um nome a elas.

Versão longa

Eu gostaria de elaborar um pouco sobre esse tópico porque acho muito interessante. Disclaimer: Eu fiz meu curso de cálculo lambda há muito tempo. Se alguém com melhor conhecimento encontrar alguma imprecisão na minha resposta, fique à vontade para me ajudar a melhorá-la.

Vamos começar com expressões, por exemplo, 1 + 2e x + 2. Literais como 1e 2são chamados constantes porque estão vinculados a valores fixos específicos.

Um identificador como xé chamado variável e, para avaliá-lo, é necessário vinculá-lo a algum valor primeiro. Então, basicamente, você não pode avaliar x + 1enquanto não souber o que xé.

A notação lambda fornece um esquema para vincular valores de entrada específicos a variáveis. Uma expressão lambda pode ser formada adicionando λx .na frente de uma expressão existente, por exemplo λx . x + 1. Variável xé dito ser livre em x + 1e ligados emλx . x + 1

Como isso ajuda na avaliação de expressões? Se você alimentar um valor para a expressão lambda, assim

(λx . x + 1) 2

então você pode avaliar toda a expressão substituindo (vinculando) todas as ocorrências da variável xpelo valor 2:

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

Portanto, a notação lambda fornece um mecanismo geral para vincular itens a variáveis ​​que aparecem em um bloco de expressão / programa. Dependendo do contexto, isso cria conceitos visivelmente diferentes nas linguagens de programação:

  • Em uma linguagem puramente funcional como Haskell, as expressões lambda representam funções no sentido matemático: um valor de entrada é injetado no corpo do lambda e um valor de saída é produzido.
  • Em muitas línguas (por exemplo, JavaScript, Python, Scheme), avaliar o corpo de uma expressão lambda pode ter efeitos colaterais. Nesse caso, pode-se usar o termo procedimento para marcar a diferença em funções puras.

Além das diferenças, a notação lambda é sobre definir parâmetros formais e vinculá-los aos parâmetros reais.

O próximo passo é atribuir um nome a uma função / procedimento. Em vários idiomas, funções são valores como qualquer outro, portanto, você pode nomear uma função da seguinte maneira:

(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 Eli Barzilay apontou, essas definições apenas vinculam o nome fa um valor, que passa a ser uma função. Portanto, nesse aspecto, funções, números, seqüências de caracteres e caracteres são todos valores que podem ser associados a nomes da mesma maneira:

(define n 42)   ;; Scheme

n = 42          -- Haskell

val n: Int = 42 // Scala

var n = 42      // JavaScript

n = 42          # Python

Nesses idiomas, você também pode vincular uma função a um nome usando a notação mais familiar (mas 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

Alguns idiomas, por exemplo, C, suportam apenas a última notação para definir funções (nomeadas).

Encerramentos

Algumas observações finais sobre fechamentos . Considere a expressão x + y. Isso contém duas variáveis ​​livres. Se você ligar xusando a notação lambda, obtém:

\x -> x + y

Essa ainda não é uma função porque ainda contém uma variável livre y. Você pode criar uma função vinculando ytambém:

\x -> \y -> x + y

ou

\x y -> x + y

que é igual à +função.

Mas você pode vincular, digamos, yde outra maneira (*):

incrementBy y = \x -> x + y

O resultado da aplicação da função incrementBy a um número é um fechamento, ou seja, uma função / procedimento cujo corpo contém uma variável livre (por exemplo y) que foi vinculada a um valor do ambiente em que o fechamento foi definido.

O mesmo incrementBy 5acontece com a função (fechamento) que incrementa os números em 5.

NOTA (*)

Estou trapaceando um pouco aqui:

incrementBy y = \x -> x + y

é equivalente a

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

então o mecanismo de ligação é o mesmo. Intuitivamente, acho que um fechamento representa um pedaço de uma expressão lambda mais complexa. Quando essa representação é criada, algumas das ligações da expressão mãe já foram definidas e o fechamento as utiliza posteriormente quando é avaliada / invocada.


Eu sou apenas um iniciante, mas acho que isso pode ser um pouco confuso se você estiver tentando entender o cálculo λ no sentido matemático, já que o que você chama de constantes é chamado de variável e denotado pelos símbolos a, b, c ... variáveis ​​de chamada seriam uma variável indeterminada x . Por outro lado, 1 é λ f x . f x , 2 é λ f x . f ( f x ) e assim por diante.
jinawee 23/02

@jinawee: Admito que não procurei a definição exata. Lembro-me de usar os termos variáveis ​​e constantes na lógica. Lá, uma constante é um símbolo que é mapeado para um domínio, enquanto uma variável é um símbolo que você pode quantificar. Mas, novamente, (1) faz muito tempo que eu fiz um curso de lógica e (2) o cálculo lambda não precisa seguir 1-1 os conceitos de lógica matemática. Se você me indicar uma referência, posso tentar corrigir minha terminologia.
Giorgio

0

"Lambda" na programação geralmente significa "função lambda" (ou também "expressão lambda", "termo lambda"). Quando function é um bloco de código nomeado definido antes de seu uso, "função lambda" é um bloco de código (ou uma expressão) definido no lugar do uso que pode ser usado como cidadão de primeira classe em uma linguagem de programação.

No JavaScript ES6 (2015), há uma breve sintaxe para definir lambdas denominadas "Funções da seta" . Em C #, essa sintaxe foi introduzida no .NET 3.0 (por volta de 2006) .

Em matemática, uma noção de "função" tem vários significados, onde um dos significados é sobre a notação de uma função (ou seja, como escrevê-la), então "função lambda" (em cálculo) é um tipo especial de notação de função. Para mais discussão, verifique as funções lambda nas linguagens de programação .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.