Estou um pouco confuso sobre 'function' e 'lambda'. Eu já vi alguns exemplos mostrando que a palavra-chave do esquema lambda
funciona 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?
fonte
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.Respostas:
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
define
para 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.
fonte
define
(oulet
um de seus parentes ou uma definição interna) para criar nomes - isso é tudo. Não há nada de especial emdefine
relação às funções.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 usandolambda
sozinho, ou seja, você pode algo que não escrever como(lambda f (x) (foo))
para definir uma função chamadaf
isso requer um argumento como você pode com afunction
palavra-chave Javascript .define
tem 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 alambda
nã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 ...)Um lambda é simplesmente uma função anônima - uma função sem nome.
fonte
lambda
expressão em Scheme é como umafunction
expressão sem nome - mas não há nada que o impeça de dar um nome a eles mais tarde. Por exemplovar 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 ...Respondida aqui: https://stackoverflow.com/questions/16501/what-is-a-lambda-function
Basicamente, o Lambda é uma função anônima.
fonte
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:
A instrução lambda é semelhante à expressão lambda, exceto que as instruções estão entre colchetes:
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.
fonte
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 + 2
ex + 2
. Literais como1
e2
sã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 avaliarx + 1
enquanto não souber o quex
é.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ávelx
é dito ser livre emx + 1
e 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
então você pode avaliar toda a expressão substituindo (vinculando) todas as ocorrências da variável
x
pelo valor 2: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:
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:
Como Eli Barzilay apontou, essas definições apenas vinculam o nome
f
a 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:Nesses idiomas, você também pode vincular uma função a um nome usando a notação mais familiar (mas equivalente):
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ê ligarx
usando a notação lambda, obtém:Essa ainda não é uma função porque ainda contém uma variável livre
y
. Você pode criar uma função vinculandoy
também:ou
que é igual à
+
função.Mas você pode vincular, digamos,
y
de outra maneira (*):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 5
acontece com a função (fechamento) que incrementa os números em 5.NOTA (*)
Estou trapaceando um pouco aqui:
é equivalente a
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.
fonte
"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 .
fonte