Je suis un peu confus à propos de 'fonction' et de 'lambda'. J'ai vu des exemples montrant que le mot-clé scheme lambda
fonctionne de manière très similaire au mot function
- clé JavaScript , mais je ne sais vraiment pas comment ils sont associés.
On me dit que «fonction» et «méthode» peuvent être utilisés de manière interchangeable lorsque l'on parle d'objets dans .net. Je me demande si «lambda» et «fonction» signifient de la même façon la même chose. Je me demande si "lambda" a un sens ésotérique, vu que la lettre grecque lambda (λ) apparaît dans de nombreux avatars sur ce site. Pour rendre les choses encore plus confuses, dans .net, les parties fonctionnelles de C # font référence à des expressions de fonction transmises à une autre fonction sous le nom d '"expressions lambda", de sorte que le mot semble vraiment être partout.
Je connais aussi vaguement le terme «calcul lambda».
Quelle est la différence entre une fonction et un lambda?
la source
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.
On pourrait espérer que ce soit en référence au lambda calcul, mais j'ai un sentiment étrange que Half Life est à blâmer pour les avatars lambda.Réponses:
Le mot "lambda" ou "expressions lambda" désigne le plus souvent des fonctions anonymes. Donc, dans ce sens, un lambda est une sorte de fonction, mais chaque fonction n’est pas nécessairement un lambda (c’est-à-dire que les fonctions nommées ne sont généralement pas appelées lambdas). En fonction du langage, les fonctions anonymes sont souvent implémentées différemment des fonctions nommées (en particulier dans les langages où les fonctions anonymes sont des fermetures et les fonctions nommées ne le sont pas). Il est donc logique de s'y référer avec des termes différents.
La différence entre le mot-clé lambda de scheme et le mot-clé function Javascript est que ce dernier peut être utilisé pour créer des fonctions anonymes et des fonctions nommées alors que le premier ne crée que des fonctions anonymes (et que vous utiliseriez
define
pour créer des fonctions nommées).Le lambda calcul est un langage de programmation / modèle mathématique minimal, qui utilise les fonctions comme seule "structure de données". Dans le calcul de lamdba, le symbole lambda est utilisé pour créer des fonctions (anonymes). C’est d’où vient l’emploi du terme "lambda" dans d’autres langues.
la source
define
(oulet
ou l'un de ses parents, ou une définition interne) pour créer des noms - c'est tout. Il n'y a rien de spécial en cedefine
qui concerne les fonctions.define
(define (f x) (foo))
(define f (lambda (x) (foo)))
lambda
(lambda f (x) (foo))
f
function
define
a cela comme un sucre syntaxique, donc ce n’est pas aussi important que son rôle d’outil de liaison de noms pour toutes les valeurs. Pour ce qui est delambda
ne pas créer un nom tout seul: c’est une caractéristique importante, car il permet de séparer les noms donnés des formes de fonction ... IMO JS fait le bon choix en permettant la séparation tout en acceptant un nom optionnel pour les masses qui en seraient horrifiées. l'idée d'une fonction sans nom. (Et heureusement, la taille de ces masses est en déclin général ...)Un lambda est simplement une fonction anonyme - une fonction sans nom.
la source
lambda
expression dans Scheme est comme unefunction
expression sans nom - mais rien ne vous empêche de leur donner un nom par la suite. Par exemplevar f = [function(x){return x;}][0]
. Vous pourriez soutenir que la valeur de la fonction elle-même n'a pas de nom, mais ce serait vrai pour toutes les fonctions ...Répondu ici: https://stackoverflow.com/questions/16501/what-is-a-lambda-function
En gros, Lambda est une fonction anonyme.
la source
En C #, fonction anonyme est un terme général qui inclut à la fois les expressions lambda et les méthodes anonymes (les méthodes anonymes sont des instances de délégué sans déclaration de méthode).
Les expressions lambda peuvent être décomposées en expression lambda et statement lambda
Expression lambda:
L'instruction lambda est similaire à l'expression lambda, à l'exception des expressions qui sont entre accolades:
Lorsque nous parlons d'expressions lambda en JavaScript, cela signifie simplement utiliser une fonction en tant qu'argument dans un appel à une autre fonction.
la source
TL; DR Comme d'autres l'ont souligné: la notation lambda est simplement un moyen de définir des fonctions sans être obligé de leur donner un nom.
Version longue
Je voudrais élaborer un peu sur ce sujet parce que je le trouve très intéressant. Disclaimer: J'ai suivi mon cours de lambda calcul il y a longtemps. Si une personne mieux informée trouve des inexactitudes dans ma réponse, n'hésitez pas à m'aider à l'améliorer.
Commençons par les expressions, par exemple
1 + 2
etx + 2
. Les littéraux tels que1
et2
sont appelés des constantes car ils sont liés à des valeurs fixes spécifiques.Un identifiant tel que celui
x
appelé variable et afin de l’évaluer, vous devez d’abord le lier à une valeur. Donc, fondamentalement, vous ne pouvez pas évaluerx + 1
tant que vous ne savez pas ce quex
c'est.La notation lambda fournit un schéma permettant de lier des valeurs d’entrée spécifiques à des variables. Une expression lambda peut être formée en ajoutant
λx .
devant une expression existante, par exempleλx . x + 1
. Variablex
est dit être libre dansx + 1
et lié àλx . x + 1
Comment cela aide-t-il à évaluer les expressions? Si vous introduisez une valeur dans l'expression lambda, comme ceci
alors vous pouvez évaluer l'expression entière en remplaçant (reliant) toutes les occurrences de la variable
x
par la valeur 2:Ainsi, la notation lambda fournit un mécanisme général pour lier des éléments à des variables qui apparaissent dans un bloc d'expression / programme. Selon le contexte, cela crée des concepts très différents dans les langages de programmation:
Outre les différences, la notation lambda consiste à définir des paramètres formels et à les lier à des paramètres réels.
La prochaine étape consiste à donner un nom à une fonction / procédure. Dans plusieurs langues, les fonctions sont des valeurs comme toutes les autres, vous pouvez donc nommer une fonction comme suit:
Comme Eli Barzilay l'a souligné, ces définitions ne font que lier le nom
f
à une valeur, qui se trouve être une fonction. Ainsi, à cet égard, les fonctions, les nombres, les chaînes, les caractères sont des valeurs pouvant être liées à des noms de la même manière:Dans ces langues, vous pouvez également associer une fonction à un nom en utilisant la notation plus connue (mais équivalente):
Certaines langues, par exemple C, ne supportent cette dernière notation que pour définir des fonctions (nommées).
Fermetures
Quelques observations finales concernant les fermetures . Considérez l'expression
x + y
. Ceci contient deux variables libres. Si vous vous liez enx
utilisant la notation lambda, vous obtenez:Ce n'est pas (encore) une fonction car elle contient toujours une variable libre
y
. Vous pouvez en faire une fonction en lianty
également:ou
ce qui est identique à la
+
fonction.Mais vous pouvez lier, par exemple,
y
d’une autre manière (*):Le résultat de l'application de la fonction incrementBy à un nombre est une fermeture, c'est-à-dire une fonction / procédure dont le corps contient une variable libre (par exemple
y
) qui a été liée à une valeur de l'environnement dans lequel la fermeture a été définie.Il en
incrementBy 5
va de même pour la fonction (fermeture) qui incrémente les nombres de 5.REMARQUE (*)
Je triche un peu ici:
est équivalent à
donc le mécanisme de liaison est le même. Intuitivement, je pense qu'une fermeture représente une partie d'une expression lambda plus complexe. Lorsque cette représentation est créée, certaines des liaisons de l'expression mère ont déjà été définies et la fermeture les utilise ultérieurement lors de son évaluation / invocation.
la source
"Programmation" signifie généralement "fonction lambda" (ou "expression lambda", "terme lambda"). Lorsque fonction est un bloc de code nommé défini avant son utilisation, "fonction lambda" est un bloc de code (ou une expression) défini à la place de l'utilisation pouvant être utilisé en tant que citoyen de première classe dans un langage de programmation.
Dans JavaScript ES6 (2015), il existe une courte syntaxe pour définir les lambdas appelée "Fonctions de flèche" . En C #, cette syntaxe a été introduite dans .NET 3.0 (vers 2006) .
En mathématiques, une notion de "fonction" a plusieurs significations, l'une des significations étant la notation d'une fonction (c'est-à-dire comment l'écrire), puis "fonction lambda" (en calcul) est un type spécial de notation de fonction. Pour plus de discussion, vérifiez les fonctions lambda dans les langages de programmation .
la source