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

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

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

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


person Robert S.    schedule 09.10.2008    source источник
comment
дублирует stackoverflow.com / questions / 167343 / stackoverflow.com/questions/150129/what-is-a-lambda   -  person jop    schedule 09.10.2008
comment
Спасибо, я прочитал эти ссылки, но они не ответили на мой вопрос. Мой вопрос немного более конкретен относительно примеров того, как эта конкретная технология полезна, и определения ее использования.   -  person Robert S.    schedule 09.10.2008


Ответы (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);

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

person Jon Skeet    schedule 09.10.2008
comment
Я увидел этот вопрос и подумал: «Ооо! Может быть, я смогу победить Джона Скита до упора! Но тогда я этого не сделал. :) +1 - person Greg D; 09.10.2008
comment
этот код выглядит довольно красиво, хотя я размышляю, правильное ли имя Select. если бы вы использовали Map, вы бы пришли к реляционной алгебре в коде. :) - person Tetha; 09.10.2008
comment
Для меня карта предлагает создать карту от ключа к значению, где вы можете искать по ключу. Лично я бы предпочел Project (). - person Jon Skeet; 09.10.2008
comment
Ранее в этом году в блоге Липперта было краткое и косвенное обсуждение чтения оператора = ›: blogs.msdn.com/ericlippert/archive/2008/05/16/ - person Greg D; 09.10.2008

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

person Chris Young    schedule 09.10.2008

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

Например, в 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)

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

person Tetha    schedule 09.10.2008
comment
Ваш последний комментарий не обязательно соответствует действительности. лямбда-выражения также позволяют создавать замыкания для переменных. - person Nicholas Mancuso; 11.04.2009

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

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

person orlando calresian    schedule 09.10.2008

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

person Jimmeh    schedule 09.10.2008

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

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

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

person Jonas    schedule 09.10.2008