2008-10-09 22 views
22

Realmente no tengo obtengo expresiones lambda. Si bien han existido desde los días de ALGOL, no comencé a escuchar sobre ellos hasta hace relativamente poco tiempo, cuando Python y Ruby se hicieron muy populares. Ahora que C# tiene la sintaxis =>, las personas en mi mundo (.NET) están hablando de expresiones de lamdba cada vez más.¿Puedes explicar expresiones lambda?

He leído el artículo de Wikipedia sobre el cálculo lambda, pero en realidad no soy un matemático. Realmente no lo entiendo desde una perspectiva práctica. ¿Cuándo usaría las expresiones lambda? ¿Por qué? ¿Cómo sabría que es lo que debería estar haciendo?

¿Puede mostrar ejemplos de cómo resolvería problemas con expresiones lambda, en un formato de antes y después? Cualquier lenguaje imperativo está bien, pero C# sería más fácil de entender para mí.

+1

duplicados http://stackoverflow.com/questions/167343/c-lambda-expression-why-should-i-use-this http://stackoverflow.com/questions/150129/what-is-a -lambda – jop

+0

Gracias, leí esos enlaces pero no respondieron mi pregunta. Mi pregunta es un poco más específica en cuanto a ejemplos de cómo esta tecnología particular es útil y la determinación de ese uso. –

Respuesta

21

Básicamente, en lo que se refiere a C#, las expresiones lambda son una forma fácil de crear un delegado (o un árbol de expresiones, pero dejemos de lado estas por el momento).

En C# 1, solo pudimos crear instancias delegadas a partir de métodos normales. En C# 2 ganamos métodos anónimos. En C# 3 obtuvimos expresiones lambda, que son como métodos anónimos más concisos.

Son particularmente concisos cuando desea expresar alguna lógica que toma un valor y devuelve un valor. Por ejemplo, en el contexto de LINQ:

     // Only include children - a predicate 
var query = dataSource.Where(person => person.Age < 18) 
         // Transform to sequence of names - a projection 
         .Select(person => person.Name); 

Hay una discusión más completa de esto - junto con otros aspectos - en my article on closures.

+0

Vi esta pregunta y pensé: "¡Ooo! ¡Tal vez pueda vencer a Jon Skeet hasta el golpe!" Pero luego no lo hice. :) +1 –

+1

ese código se ve bastante bien, aunque estoy pensando si Select es el nombre correcto. si usaba Map, llegaría al álgebra relacional en el código. :) – Tetha

+0

Para mí, Map sugiere la creación de un mapa de clave a valor, donde puede buscar por clave. Personalmente prefiero Project(). –

0

Mi uso principal de expresiones lambda en .NET ha sido cuando trabajo con listas. Usando una expresión lambda puede construir una consulta en una lista de manera similar a como construiría una declaración SQL para buscar en una tabla de base de datos.

2

Las funciones lambda son solo funciones anónimas.

Por ejemplo, en python, desea duplicar todos los elementos en una lista. Hay más o menos tres maneras de hacerlo:

lista expresiones:

[2*x for x in list] 

función explícita:

def double(x): 
    return 2*x 
map(double, list) # iirc 

con lambdas:

double = lambda x : 2*x 
map(double, list) 

lo tanto, una lambda en la mayoría de los lenguajes es solo una forma de evitar la carga sintáctica de crear una nueva función.

+2

Su comentario final no es necesariamente cierto. Las lambdas también brindan la capacidad de crear cierres sobre variables. –

0

Una expresión lambda es un valor funcional (en el mismo sentido que 'int' y 'string' son valores). Esto significa que es posible

  • definen una variable que contiene una expresión lambda (esto es la misma que la definición de una función)
  • retorno una expresión lambda a partir de un método o función
  • enviar una expresión lambda como argumento para una función o método

Observe funciones como asignar, filtrar o plegar (en cualquier idioma funcional) para ver cómo se usan las expresiones lambda como argumentos para otras funciones.