2010-09-30 25 views
38

Recientemente tuve dos entrevistas telefónicas.Entrevista: ¿Qué es la expresión lambda?

En ambas entrevistas me preguntaron como la última pregunta para definir una expresión Lambda.

Reclamé que la expresión Lambda es un método sin nombre en lugar de un delegado. Pero de alguna manera eso no fue suficiente.

Me resulta muy difícil explicar esto precisamente en una entrevista telefónica.

¿Alguien sabe mejor?

+2

http://stackoverflow.com/questions/471502/what-is-linq/471592#471592 La parte de arriba "Vamos a empezar esta exploración". –

+1

Todos los métodos LINQ llevan el nombre. Algunos toman métodos sin nombre como parámetros, es decir, métodos anónimos o expresiones lambda – Greg

+0

No puedo creer la cantidad de personas que respondieron este duplicado obvio. –

Respuesta

33

Lambda Las expresiones son funciones sin nombre dadas como valores constantes. Pueden aparecer en cualquier lugar que pueda tener cualquier otra constante, pero normalmente se escriben como un parámetro para alguna otra función. El ejemplo canónico es que pasará una función de comparación a una rutina genérica de "clasificación", y en lugar de tomarse la molestia de definir una función completa (e incurrir en la discontinuidad léxica y la contaminación del espacio de nombres) para describir esta comparación, puede simplemente pasa una expresión lambda que describe la comparación.

SIN EMBARGO, esto omite una de las características más importantes de Lambda Expressions, que es que se ejecutan en el contexto de su apariencia. Por lo tanto, pueden usar los valores de las variables que se definen en ese contexto. Esto diferencia a los punteros de función de las verdaderas expresiones lambda. En los lenguajes que admiten variables mutables, las expresiones lambda adecuadas ofrecen la posibilidad de cambiar los valores de esas variables.

Las expresiones lambda aparecen (con sintaxis diferente) en todos los LISP, Perl, Python y versiones suficientemente recientes de C++, Objective C, C# y Java 8, pero notablemente no en C aunque tiene una forma de tratar pasando funciones (o alguna excusa para ellas) alrededor como parámetros. Son un elemento de sintaxis con una semántica particular, y esa semántica establece más requisitos en el tiempo de ejecución de los que C estaba diseñado para requerir.

+3

Las expresiones Lambda están disponibles en Java a partir de JDK-1.8. Creo que se ven muy similares a las expresiones Lambda en C#, excepto que la "Flecha Fat" de Java es delgada; frente a => – series0ne

1

Tal vez solo querían escuchar que LINQ era "Queja integrada al lenguaje".

Dicho esto, si realmente quieren una explicación de "qué" está compuesto LINQ, probablemente habría incluido más información que usted proporcionó. Algo así como:

LINQ, o Language-Integrated Query, es un conjunto de adiciones de lenguaje y clases de marco agregadas en .NET 3.5 que permiten un enfoque más funcional para las operaciones de consulta. Se basa en los métodos de extensión para IEnumerable e IQueryable y sus homólogos genéricos que permiten la ejecución diferida en LINQ to Objects y el procesamiento remoto a través de IQueryable, así como muchas otras funciones. También se realizaron cambios de lenguaje en C# y VB.NET para admitir una sintaxis de consulta más "natural" directamente en el idioma.

0

Están probablemente en busca de que sepan que LINQ es el nuevo DSL para consultar IQueryable y IEnumerable objetos. La sintaxis "from ... where ... select ...", esencialmente. Sabiendo que está implementado debajo de las portadas con lambdas y estilo funcional probablemente obtendría puntos de bonificación.

1

Bueno, dijo que LINQ es un método sin nombre en lugar de un delegado.

En realidad, eso no LINQ en absoluto, sino una "expresión lambda". Y técnicamente, LINQ ni siquiera los usa.

LINQ significa "Language Integrated Query". Muy específicamente, son las palabras clave "de ... donde ... seleccionar" (es decir, la consulta sintaxis que es integrada en el idioma ).

Ahora, para hacer que esas palabras clave hagan las cosas, se agregó mucho más al lenguaje (y al CLR) (como lambdas, métodos de extensión, la clase Enumerable, etc.).

+0

Me acabo de dar cuenta de que he arruinado la pregunta. Tienes razón. La pregunta debería haber sido la expresión de Lambda. En el momento de escribir, tenía algo de LINQ en mente. :( – Houman

1

Para responder a su pregunta revisada, para eso, su respuesta es realmente buena. El único cambio que haría es enfatizar la palabra "en línea".

La expresión Lambda es un método sin nombre que se escribe en línea en el lugar donde se necesita un delegado.

13

Una expresión lambda es una suspensión de código anónimo.

Considere esta función anónima de "multiplicar dos cosas" (a.k.a.expresión lambda), usando una notación muy no específica.

λ(x, y) -> x * y 

Su respuesta fue muy específico a un lugar donde usted tiene lambdas usados ​​(supongo C#?), Y sospecho que el entrevistador estaba pidiendo una comprensión más general. El concepto de un delegado, el lenguaje C# y la idea de un método son todos secundarios a lo que es una lambda y cómo funcionan. Puede calcular utilizando las expresiones lambda on paper, por ejemplo, sin métodos involucrados.

+2

Me alejaría de la noción particular de "código": la abstracción lambda tiene que ver con la computación, no con un lenguaje particular en el que se pueda describir tal cálculo. Simplemente ocurre que algunos lenguajes de programación incluyen sintaxis para representarlos más o menos directamente , al igual que la mayoría de los populares representan expresiones algebraicas directamente. – Ian