Можете ли вы объяснить лямбда-выражения?
Я действительно не получаю лямбда-выражения. Хотя они были со времен 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 (на любом функциональном языке), чтобы увидеть, как лямбда-выражения используются в качестве аргументов для других функций.