web-dev-qa-db-fra.com

Interview: Qu'est-ce que l'expression Lambda?

J'ai récemment eu deux entretiens téléphoniques.

Dans les deux entretiens, on m'a posé la dernière question pour définir une expression Lambda.

J'ai affirmé que l'expression Lambda est une méthode sans nom à la place d'un délégué. Mais d'une manière ou d'une autre, cela ne suffisait pas.

J'ai du mal à l'expliquer précisément lors d'un entretien téléphonique.

Quelqu'un sait-il mieux?

44
Houman

Les expressions lambda sont des fonctions sans nom données sous forme de valeurs constantes. Ils peuvent apparaître n'importe où que n'importe quelle autre constante, mais ils sont généralement écrits en tant que paramètre d'une autre fonction. L'exemple canonique est que vous passerez une fonction de comparaison à une routine générique de "tri", et au lieu de vous donner la peine de définir une fonction entière (et de subir la discontinuité lexicale et la pollution de l'espace de noms) pour décrire cette comparaison, vous pouvez simplement passer une expression lambda décrivant la comparaison.

TOUTEFOIS, cela manque l'une des fonctionnalités les plus importantes des expressions Lambda, c'est qu'elles s'exécutent dans le contexte de leur apparence. Par conséquent, ils peuvent utiliser les valeurs des variables définies dans ce contexte. Cela différencie les pointeurs de fonction des vraies expressions lambda. Dans les langages prenant en charge les variables mutables, les expressions lambda appropriées offrent le pouvoir de modifier les valeurs de ces variables.

Les expressions lambda apparaissent (avec une syntaxe différente) dans tous les LISP, Perl, Python et les versions suffisamment récentes de C++, Objective C, C # et Java 8, mais notamment pas en C même s'il a un moyen de gérer les fonctions de passage (ou une excuse pour elles) comme paramètres. Il s'agit d'un élément de syntaxe avec une sémantique particulière, et ces sémantiques imposent plus d'exigences à l'exécution que C n'a été conçu.

39
Ian

Une expression lambda est une suspension de code sans nom.

Considérez cette fonction anonyme "multiplier deux choses" (expression lambda a.k.a.), en utilisant une notation très non spécifique.

λ(x, y) -> x * y

Votre réponse était très spécifique à un endroit où vous avez utilisé des lambdas (je suppose que C #?), Et je soupçonne que l'intervieweur demandait une compréhension plus générale. Le concept d'un délégué, le langage C # et l'idée d'une méthode sont tous secondaires par rapport à ce qu'est un lambda et à son fonctionnement. Vous pouvez calculer en utilisant des expressions lambda sur papier , par exemple, sans aucune méthode impliquée.

18
Andres Jaan Tack

Eh bien, j'ai dit que Linq est une méthode sans nom à la place d'un délégué.

En fait, ce n'est pas du tout LINQ, mais une "expression lambda". Et techniquement, LINQ ne les utilise même pas.

LINQ signifie "Language Integrated Query". Plus précisément, ce sont les mots clés "de ... où ... sélectionner" (c'est-à-dire la syntaxe requête qui est intégrée dans la langue) .

Maintenant, pour que ces mots clés fassent des choses, beaucoup plus a été ajouté au langage (et au CLR) (comme les lambdas, les méthodes d'extension, la classe Enumerable, etc.).

1
James Curran

Vous devriez regarder dans Expression Lambda dans msdn

1
Delashmate

Peut-être qu'ils voulaient juste entendre que LINQ était une "requête intégrée aux langues".

Cela étant dit, s'ils veulent vraiment une explication de "en quoi" LINQ est composé, j'aurais probablement inclus plus d'informations que vous avez fournies. Quelque chose comme:

LINQ, ou Language-Integrated Query, est un ensemble d'ajouts de langage et de classes de structure ajoutés dans .NET 3.5 qui permettent une approche plus fonctionnelle des opérations de requête. Il est basé sur des méthodes d'extension pour IEnumerable et IQueryable et leurs homologues génériques qui permettent une exécution différée dans LINQ to Objects et un traitement à distance via IQueryable, ainsi que de nombreuses autres fonctionnalités. Des modifications ont également été apportées au langage C # et VB.NET pour prendre en charge une syntaxe de requête plus "naturelle" directement dans le langage.

1
Reed Copsey

Pour répondre à votre question révisée, pour cela, votre réponse est en fait bonne. Le seul changement que je ferais est de souligner le mot "en ligne".

L'expression lambda est une méthode sans nom qui est écrite en ligne à l'endroit où un délégué est nécessaire.

1
James Curran

Ils recherchent probablement que vous sachiez que LINQ est le nouveau DSL pour interroger les objets IQueryable et IEnumerable. La syntaxe "from ... where ... select ...", essentiellement. Sachant qu'il est implémenté sous les couvertures avec des lambdas et un style fonctionnel, vous obtiendrez probablement des points bonus.

0
Mark