Можете ли вы объяснить лямбда-выражения?

Я действительно не получаю лямбда-выражения. Хотя они были со времен ALGOL, я начал слышать о них совсем недавно, когда Python и Ruby стали очень популярными. Теперь, когда C# имеет => Синтаксис, люди в моем мире (.NET) все больше говорят о выражениях lamdba.

Я читал статью в Википедии о лямбда-исчислении, но на самом деле я не математик. Я не очень понимаю это с практической точки зрения. Когда я буду использовать лямбда-выражения? Зачем? Откуда мне знать, что это то, что я должен делать?

Можете ли вы показать примеры того, как бы вы решали проблемы с лямбда-выражениями в формате "до и после"? Любой императивный язык - это хорошо, но мне будет проще понять C#.

6 ответов

Решение

В основном, что касается C#, лямбда-выражения - это простой способ создать делегат (или дерево выражений, но давайте пока оставим их в стороне).

В C# 1 мы могли создавать экземпляры делегатов только из обычных методов. В C# 2 мы получили анонимные методы. В C# 3 мы получили лямбда-выражения, которые похожи на более лаконичные анонимные методы.

Они особенно лаконичны, когда вы хотите выразить некоторую логику, которая принимает одно значение и возвращает значение. Например, в контексте 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);

Более полное обсуждение этого - наряду с другими аспектами - в моей статье о замыканиях.

Ответы на этот вопрос могут быть полезны для вас.

Лямбда-функции - это просто анонимные функции.

Например, в python вы хотите удвоить все элементы в списке. Существует три способа сделать это:

Список-выражения:

[2*x for x in list]

явная функция:

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

с лямбдами:

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

Итак, лямбда в большинстве языков - это просто способ избежать синтаксических издержек при создании новой функции.

Это одно из лучших объяснений, которые я видел, как понять большие идеи использования лямбда-выражений в C#:

http://www.developingfor.net/c-30/upgrade-your-c-skills-part-3-lambda-expressions.html

Мое основное использование лямбда-выражений в.NET было при работе со списками. Используя лямбда-выражение, вы можете создать запрос к списку аналогично тому, как если бы вы строили оператор SQL для поиска в таблице базы данных.

Эта статья должна соответствовать вашим интересам. Основные инстинкты: лямбда-выражения

Лямбда-выражение является функциональным значением (в том же смысле, в котором значения 'int' и 'string' являются значениями). Это означает, что возможно

  • определить переменную, которая содержит лямбда-выражение (это то же самое, что определение функции)
  • вернуть лямбда-выражение из метода или функции
  • отправить лямбда-выражение в качестве аргумента функции или методу

Посмотрите на такие функции, как map, filter или fold (на любом функциональном языке), чтобы увидеть, как лямбда-выражения используются в качестве аргументов для других функций.

Другие вопросы по тегам