fonctions lambda anonymes (programmation fonctionnelle)

10

Que sont les fonctions anonymes (lambda)? Quelle est la définition formelle d'une fonction anonyme dans un langage de programmation fonctionnel?

En termes simples, lorsque je programme en schéma / lisp, je dirais qu'une fonction anonyme (lambda) est une fonction qui n'est pas liée à un identifiant.

Est-ce tout ce que vous pouvez dire formellement à propos d'une fonction lambda? Je pense qu'il y a plus de détails à ajouter à cette définition simple. Veuillez élaborer et merci!

CodeKingPlusPlus
la source

Réponses:

10

À mon avis, c'est tout ce que vous pouvez vraiment dire à leur sujet.

L'idée est que dans un langage d'ordre supérieur, une fonction n'est qu'un autre type de valeur. De la même manière que vous pouvez avoir (3 + 4) sans identifiant en C, vous pouvez avoir (lambda (x) + (3 x))) sans identifiant dans le schéma.

La clé ici n'est pas qu'il y ait quelque chose de spécial dans les fonctions anonymes. Seules les restrictions des autres langages nécessitent que les fonctions soient traitées différemment de toute autre valeur. Les définitions spéciales sont pour les langages procéduraux qui ne les autorisent pas, pas pour les langages fonctionnels avec do.

jmite
la source
11

Dans le calcul lambda, toutes les fonctions (termes) sont anonymes. C'est une propriété essentielle du calcul lambda: vous pouvez composer des fonctions complexes à partir de fonctions plus simples sans leur donner de noms.

Dans les langages de programmation, il est dans la plupart des cas souhaitable de donner des noms aux fonctions, car c'est notre façon de penser et cela rend le code lisible pour les humains. Mais la compilation supprime finalement les noms lors de la production d'un exécutable (si nous ne tenons pas compte des informations de débogage).

Si un langage permet d'exprimer des fonctions anonymes (c'est-à-dire des fonctions sans noms), il peut donner un avantage aux programmeurs et aux compilateurs: les programmeurs peuvent souvent écrire du code plus court, et les compilateurs peuvent mieux optimiser, sachant qu'une fonction anonyme est utilisée juste au moment donné lieu et nulle part ailleurs.

Petr Pudlák
la source
1

Cela dépend de la partie de votre question sur laquelle vous mettez l'accent. S'il s'agit spécifiquement de la propriété d'être anonyme pour des fonctions anonymes, alors la seule réponse est qu'il s'agit de valeurs non liées . Si vous parlez des fonctions en général, les fonctions anonymes sont probablement la manifestation la plus visible de l'utilisation du lambda calcul dans un cadre fonctionnel, pour les langages applicatifs .

En fait, du point de vue du calcul lambda, les expressions lambda sont la construction très syntaxique utilisée pour créer des liaisons. Rappelez-vous la notation utilisée dans le calcul lambda:

λF.λX.FX

où et sont liés dans l'expression interne . Chaque expression lambda définit la liaison et agit ainsi comme un contexte local pour les liaisons de nom.FXFX

Un langage offre généralement des moyens, tels que let(ML comme langages, schémas) ou define(schéma) pour créer des liaisons utilisables au niveau supérieur (ou dans des constructions syntaxiques plus complexes que des fonctions, comme des modules ou des objets), mais le seul outil nécessaire pour les liaisons sont le lambda à des niveaux inférieurs.

Si vous regardez des langues comme le schéma ou les dialectes lisp, leur fondement même est le lambda calcul, et de nombreuses formes spéciales sont vraiment des lambdas enrobées de sucre.

Pour les langues concaténatives , l'histoire est légèrement différente. Les lambdas ne sont pas nécessaires et en fait contre-productifs. Quel est l'intérêt de définir des lambdas anonymes, quand tout est fonction ?

Il existe en quelque sorte une dualité entre ces deux types de langues. Le dernier se concentre sur la combinaison de fonctions sans points et essaie donc de tout représenter comme des fonctions, tandis que le premier travaille sur un calcul plus élaboré et s'efforce d'avoir des fonctions comme valeurs de première classe, comme toutes les autres valeurs du langage. À cet égard, on pourrait voir les lambdas comme le résultat de cet effort.

Quelques pointeurs sur le sujet introduits (mal) dans cette réponse:

didierc
la source