Qu'est-ce qu'un Lambda?

93

Quelqu'un pourrait-il fournir une bonne description de ce qu'est une Lambda? Nous avons une balise pour eux et ils sont sur les secrets de la question C #, mais je n'ai pas encore trouvé une bonne définition et une explication de ce qu'ils sont en premier lieu.

Fred
la source
1
Que diriez-vous de l'article sur le calcul lambda de Wikipedia pour commencer? Puis l'article sur la programmation fonctionnelle de Wikipedia en guise de suivi.
Thorsten79
2
duplication possible de Qu'est-ce qu'une lambda (fonction)?
nawfal
expression amda expliquée ici magnifiquement.
Jameer Mulani

Réponses:

135

Les fermetures, les lambdas et les fonctions anonymes ne sont pas nécessairement la même chose.

Une fonction anonyme est une fonction qui n'a pas (ou, du moins, n'a pas besoin) de son propre nom.

Une fermeture est une fonction qui peut accéder à des variables qui étaient dans sa portée lexicale lorsqu'elle a été déclarée, même après qu'elles sont devenues hors de portée. Les fonctions anonymes ne doivent pas nécessairement être des fermetures, mais elles sont dans la plupart des langues et deviennent un peu moins utiles lorsqu'elles ne le sont pas.

Un lambda n'est pas aussi bien défini en ce qui concerne l'informatique. Beaucoup de langues n'utilisent même pas le terme; au lieu de cela, ils les appelleront simplement des fermetures ou des fonctions anon ou inventeront leur propre terminologie. Dans LISP, un lambda est simplement une fonction anonyme. En Python, un lambda est une fonction anonyme spécifiquement limitée à une seule expression; rien de plus, et vous avez besoin d'une fonction nommée. Les lambdas sont des fermetures dans les deux langues.

Évoli
la source
le terme pourrait être destiné à impliquer le calcul lambda en.wikipedia.org/wiki/Lambda_calculus
Steven A. Lowe
Wow, j'ai eu plus d'un vote pour donner cette question. J'ai vu tellement de réponses techniques enlisées dans la terminologie, mais celle-ci est concise et fait le point immédiatement.
Matthew Stopa
8
+1 pour ne pas utiliser le terme «fermer» pour définir une clôture comme si elle la rendait plus claire.
Daniel
5
Une région où une variable peut exister (c'est-à-dire, une portée) définie par la structure de votre code (c'est-à-dire lexicalement). Par exemple, dans la plupart des langages, une fonction définit une portée lexicale; toute variable déclarée à l'intérieur de la fonction est inaccessible en dehors de celle-ci.
Eevee
19

Aussi appelé fermetures ou fonctions anonymes .. J'ai trouvé la meilleure description ici . Fondamentalement, bloc de code en ligne qui peut être passé en argument à une fonction.

Gulzar Nazim
la source
8

Il s'agit simplement d'une fonction anonyme déclarée en ligne, le plus souvent attribuée à un délégué lorsque vous ne souhaitez pas écrire une fonction à part entière.

Dans des langages comme lisp / scheme, ils sont souvent transmis assez libéralement en tant que paramètres de fonction, mais l'idiome en C # trouve généralement que les lambdas sont utilisés uniquement pour l'évaluation paresseuse des fonctions, comme dans linq, ou pour rendre le code de gestion des événements un peu terser.

JasonVrai
la source
5

Il n'y a pas vraiment de «lambda» dans la programmation. Cela dépend de la langue, etc.

En bref, normalement un langage qui «a des lambdas» utilise le terme pour des fonctions anonymes ou, dans certains cas, des fermetures. Comme ça, en Ruby:

f = lambda { return "this is a function with no name" }
puts f.call
rfunduk
la source
4

En réponse aux réponses précédentes:
-La chose importante à propos des fonctions anonymes n'est pas qu'elles ne nécessitent pas de nom.
-Les fermetures sont un concept distinct.
-Un article gigantesque de wikipedia ne rend pas cela plus clair.

Voici ma réponse en 3 parties:
1. Un lambda est une fonction qui est aussi une expression. C'est la chose importante.
2. De nombreux langages qui implémentent des soi-disant «lambdas» ajoutent du sucre syntaxique pour rendre l'écriture de ces courtes fonctions plus facile et plus rapide, mais ce n'est pas obligatoire.
3. Certaines langues peuvent exiger qu'un lambda n'ait aucun effet secondaire . Ce serait un lambda plus pur au sens fonctionnel.

Lorsqu'une fonction est une expression, c'est un «citoyen de première classe» dans la langue. Je peux faire toutes les choses importantes avec:

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
la source
1

Extrait de wikipedia: http://en.wikipedia.org/wiki/Lambda#Lambda.2C_the_word

Dans les langages de programmation tels que Lisp et Python, lambda est un opérateur utilisé pour désigner des fonctions anonymes ou des fermetures, après l'utilisation du calcul lambda.

Engrener
la source
Je suppose que vous vouliez dire cette ligne: dans les langages de programmation tels que Lisp et Python, lambda est un opérateur utilisé pour désigner des fonctions anonymes ou des fermetures, suivant l'utilisation du calcul lambda. J'avais déjà scanné l'article mais je l'avais manqué.
Fred le