O que é um Lambda?

93

Alguém poderia fornecer uma boa descrição do que é um Lambda? Temos uma tag para eles e eles estão nos segredos da questão do C #, mas ainda não encontrei uma boa definição e explicação do que eles são.

Fred
fonte
1
Que tal o artigo sobre cálculo lambda da Wikipedia para começar? Em seguida, o artigo de programação funcional da Wikipedia como um acompanhamento.
Thorsten79,
2
possível duplicata de O que é lambda (função)?
nawfal
expressão amda explicada aqui lindamente.
Jameer Mulani

Respostas:

135

Fechamentos, lambdas e funções anônimas não são necessariamente a mesma coisa.

Uma função anônima é qualquer função que não tem (ou, pelo menos, precisa) seu próprio nome.

Um encerramento é uma função que pode acessar variáveis ​​que estavam em seu escopo léxico quando foi declarada, mesmo depois de terem saído do escopo. As funções anônimas não precisam ser necessariamente encerramentos, mas são na maioria das linguagens e se tornam menos úteis quando não são.

Um lambda não é ... tão bem definido no que diz respeito à ciência da computação. Muitas línguas nem usam o termo; em vez disso, eles apenas os chamarão de encerramentos ou funções anônimas ou inventarão sua própria terminologia. No LISP, um lambda é apenas uma função anônima. Em Python, um lambda é uma função anônima limitada especificamente a uma única expressão; qualquer coisa a mais, e você precisa de uma função nomeada. Lambdas são encerramentos em ambas as línguas.

Eevee
fonte
o termo pode ter a intenção de implicar lambda calculus en.wikipedia.org/wiki/Lambda_calculus
Steven A. Lowe
Uau, tive mais de um voto positivo para fazer esta pergunta. Já vi tantas respostas técnicas atoladas em terminologia, mas esta é concisa e esclarece imediatamente.
Matthew Stopa
8
1 por não usar o termo "fechar" para definir um fechamento como se isso o tornasse mais claro.
Daniel,
5
Uma região onde pode existir alguma variável (ou seja, um escopo) definida pela estrutura do seu código (ou seja, lexicamente). Por exemplo, na maioria das linguagens, uma função define um escopo léxico; qualquer variável declarada dentro da função é inacessível fora dela.
Eevee
19

Também chamados de encerramentos ou funções anônimas .. Encontrei a melhor descrição aqui . Basicamente, um bloco de código embutido que pode ser passado como um argumento para uma função.

Gulzar Nazim
fonte
8

É apenas uma função anônima declarada embutida, geralmente atribuída a um delegado quando você não deseja escrever uma função completa.

Em linguagens como lisp / scheme, eles costumam ser transmitidos de maneira bastante liberal como parâmetros de função, mas o idioma em C # normalmente encontra lambdas usados ​​apenas para avaliação preguiçosa de funções, como em linq, ou para tornar o código de manipulação de eventos um pouco mais complexo.

JasonTrue
fonte
5

Não existe realmente algo como 'um lambda' na programação. Depende do idioma, etc.

Resumindo, normalmente uma linguagem que 'tem lambdas' usa o termo para funções anônimas ou, em alguns casos, fechamentos. Assim, em Ruby:

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

Em resposta às respostas anteriores:
-O importante sobre funções anônimas não é que elas não exijam um nome.
-Fechos são um conceito separado.
-Um artigo gigante da Wikipedia não está deixando isso mais claro.

Aqui está minha resposta em 3 partes:
1. Um lambda é uma função que também é uma expressão. Isso é o importante.
2. Muitas linguagens que implementam os chamados "lambdas" adicionam um pouco de açúcar sintático para tornar a escrita dessas funções curtas mais fácil e rápida, mas isso não é obrigatório.
3. Alguns idiomas podem exigir que um lambda não tenha efeitos colaterais . Isso seria um lambda mais puro no sentido funcional.

Quando uma função é uma expressão, é um "cidadão de primeira classe" dentro da linguagem. Posso fazer todas as coisas importantes com ele:

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
fonte
1

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

Em linguagens de programação como Lisp e Python, lambda é um operador usado para denotar funções anônimas ou encerramentos, seguindo o uso do cálculo lambda.

Malha
fonte
Acho que você quis dizer esta linha: em linguagens de programação como Lisp e Python, lambda é um operador usado para denotar funções anônimas ou encerramentos, seguindo o uso do cálculo lambda. Eu já tinha lido o artigo, mas não percebi.
Fred