10
votes

Quel plaisir peut être avec les définitions de Lambda?

Ne pas les avoir utilisées tout cela beaucoup, je ne suis pas tout à fait sûr de toutes les manières Les définitions Lambda peuvent être utilisées (autres que la syntaxe de fonction locale de la carte / collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte / de collecte Pour toute personne intéressée à afficher des exemples:

  • fournir des explications pour aider les lecteurs à comprendre comment les définitions de Lambda sont utilisées;

  • Langues préférées pour les exemples: Python, SmallTalk, Haskell.


0 commentaires

6 Réponses :


2
votes

Vous pouvez faire une structure de données fonctionnelle de Lambdas. Voici une simple liste fonctionnelle (Python), supportant Ajouter code> et Contient des méthodes CODE>:

empty = lambda x : None

def add(lst, item) :
    return lambda x : x == item or lst(x)

def contains(lst, item) :
    return lst(item) or False


1 commentaires

changerait-le pour travailler? DEF contient (liste, élément): retourner dernier (article) ou aucun



2
votes

Vous pouvez les utiliser pour le flux de contrôle. Par exemple, dans SmallTalk, la méthode "iftrue: iffalse:" est une méthode sur des objets booléens, avec une implémentation différente sur chacune des classes vraies et fausses. L'expression xxx utilise deux fermetures --- blocs, dans [Supports carrés] dans SmallTalk Syntaxe --- une pour la branche vraie et une pour la fausse branche. La mise en œuvre de "iftrue: iffalse:" pour les instances de la classe true est xxx

et pour la classe false: xxx

Les fermetures, ici, sont utilisées pour retarder l'évaluation de sorte qu'une décision concernant le flux de contrôle puisse être prise, sans aucune syntaxe spécialisée du tout (en plus de la syntaxe des blocs).

haskell est Un peu différent, avec son modèle d'évaluation paresseux produisant efficacement l'effet des fermetures dans de nombreux cas, mais dans le schéma, vous finissez par utiliser Lambdas pour le flux de contrôle. Par exemple, voici un utilitaire pour récupérer une valeur d'une liste d'associations, fournissant une valeur par défaut éventuellement calculée dans le cas où la valeur n'est pas présente: xxx

il serait Soyez appelé comme ceci: xxx

La clé est l'utilisation de la Lambda pour retarder le calcul de la valeur par défaut jusqu'à ce qu'il soit réellement connu soit requis.

Voir aussi le style de poursuite de la poursuite, qui prend cela à un extrême. JavaScript, par exemple, repose sur le style et les fermetures de passage de continuation et de passage pour effectuer toutes ses opérations de blocage (comme sommeil, E / S, etc.).

ETA : où je J'ai dit des fermetures ci-dessus, je veux dire fermetures lexiquement scopées . C'est la portée lexicale qui est la clé, souvent.


2 commentaires

Pourriez-vous ajouter une description de la structure lexicale?


@Roman: Scoping lexical signifie que si vous avez une fonction comme F: = A -> (x -> (A ++) * x) , l'appel f (2) retournera la fonction x -> ((A ++) * x avec a lié ​​à une variable qui a la valeur 2. car c'est le A dans la portée où la fonction a été définie dans un sens lexical. Ce A est toutefois complètement indépendant du A dans la fonction renvoyée par f (3) ou par un autre f (2 ) Appel, puisque chaque appel crée une nouvelle fermeture.



1
votes

Vous pouvez utiliser une lambda pour créer un combinateur Y, une fonction qui prend une autre fonction et le retourne une forme récursive. Voici un exemple:

def Y(le):
    def _anon(cc):
        return le(lambda x: cc(cc)(x))
    return _anon(_anon)


0 commentaires

0
votes

Un exemple de haskell pour calculer la dérivée d'une seule fonction variable à l'aide d'une approximation numérique: xxx


0 commentaires

1
votes

Son C #, mais je reçois personnellement un coup de pied de cet article à chaque fois que je le lisez:

Données de construction d'un air mince - une mise en œuvre des inconvénients de LISP, La voiture et les fonctions CDR en C #. Il montre comment construire une structure de données de pile simple entièrement à partir de fonctions Lambda.


0 commentaires

1
votes

Ce n'est pas vraiment tout le même concept que dans Haskell, etc., mais en C #, la construction de Lambda a (éventuellement) la possibilité de compiler à un modèle Objcet représentant le code < / em> (expression-arbres) plutôt que de coder lui-même (c'est lui-même l'une des pierres angulaires de Linq).

Cela peut conduire à certaines opportunités de méta-programmation très expressives, par exemple (où la Lambda est exprimée ici "Compte tenu d'un service, que veux-tu faire avec ça?"): xxx

(supposant un approprié d'invoquer Signature)

Il y a beaucoup d'utilisations pour ce type de chose, mais je l'ai utilisé pour construire une pile RPC qui ne nécessite aucune génération de code d'exécution - il analyse simplement l'arborescence d'expression, des chiffres sur ce que l'appelant a voulu, Le traduit en RPC, l'invoque, recueille la réponse, etc. (discuté plus ici < / a>).


0 commentaires