Что такое лямбда и что такое пример реализации?

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

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

Что такое лямбда (функция)?

6 ответов


лямбда трудно поймать, но как только вы их представили, вы не можете понять, почему вы не получили его раньше.

Lamdba являются анонимными функциями

лямбда-это обычные функции, единственная разница заключается в том, что вы не даете им имя.

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

поэтому, когда вы делаете что-то вроде что :

function Foo ()
{
 /* your code here */
}

то, что вы действительно делаете, это привязка имени "Foo" к адресу кода в памяти.

Теперь есть другой способ доступа к адресу:ссылки (и указатели, но давайте пропустим этих противных парней)

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

как вы их используете ?

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

шаг за шагом процесс, как правило :

  1. создать функции
  2. ссылку
  3. передайте ссылку где-нибудь, где она будет использоваться

наконец, ссылка теряется, и поэтому функция уничтожается автоматически.

типичным случаем использования является функция обратного вызова. Вы объявляете, создаете и передаете функцию в одной строке, поэтому это удобно.

пример из настоящее слово

в Python вы можете использовать лямбда в списках:

/* create a list of functions */
function_list = [(lambda x : number_to_add + x) for number_to_add in range(0, 10) ]

в Javascript вы обычно передаете функцию другим функциям. Пример с JQuery:

 $("img").each(

 /* here we pass a function without any name to the "each()" method   */

 function(i){  his.src = "test"   i   ".jpg"; }

 );

то, что вам лучше знать

  • некоторые языки, такие как Javascript или Lisp, широко используют лямбды. Это может быть по культурным причинам, но парадигма функционального программирования имеет тенденцию приводить к лямбда-мания.

  • длинные лямбды затрудняют чтение кода. Вот почему некоторые языки ограничивают возможности лямбд, таких как Python, который не позволяет оператор "if" в них.

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


лямбда-это встроенное описание функции. Он возник из функциональных языков программирования и количество других языков, которые поддерживают что-то подобное, растет в наши дни. Название происходит от математической вещи, называемой лямбда-исчислением, которая повлияла на функциональные языки программирования (такие как Lisp), и идея лямбд происходит от нее.

Ваш вопрос зависит от языка программирования, о котором ты говоришь. Например, в F#, вы должны использовать fun x -> x * x представлять

int myfunction(int x) { return x * x; }

В C#, вы должны использовать x => x * x для представления той же функции. Как он используется и что с ним можно сделать очень многое зависит от языка, на котором вы работаете.

говоря о C#, Самое замечательное в них-это способность анализировать их как деревья выражений. Лямбда-выражение может использоваться как код, как делегат (примерно указатель функции) или как данные в дереве выражений. Используя их как деревья выражений, сделать библиотеки, такие как LINQ to SQL, чтобы иметь возможность использовать выражение для создания оператора SQL для отправки на сервер и получить соответствующие результаты.


лямбда-это средство создания анонимной функции или закрытия. В императивных языках (и функциональных) это эквивалентно разрешению вложенных функций, где внутренняя функция имеет доступ к локальной переменной и параметров включающей функции. Он находится в функциональных языках под ключевыми словами lambda, fun, fn или даже \; в Smalltalk это называется блок. Он также встречается в большинстве скриптовых языков, например, Perl, Python, Lua и т. д.

о единственных языках без Lambda-это

  • языки без вложенных функций, таких как стандартный C или Icon

  • языки с вложенными функциями второго класса - - - функция не может быть возвращена из функции, сохранена в глобальной переменной или сохранена в структуре данных, выделенной кучей. Это языковое семейство включает в себя Паскаль и его потомков в Modula, Ada и CLU семьи.

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

пример: одна из самых простых функций-композиция (Haskell синтаксис):

compose f g = \x -> f (g x)

это говорит о том, что compose исполняет две функции f и g в качестве аргументов, и возвращает анонимную функцию, которая принимает аргумент x а затем применяется g а то f to x. Применение compose создает закрытие на куче, который хранит значение f и g а также указатель на код для тела лямбды. В языках, где лямбда распространена, таких как Haskell, ML, Caml, и схема, много усилий было затрачено делая распределение ослепительно быстро. Некоторые языки сценариев, такие как Lua, имеют необычные реализации, которые делают случай без лямбды таким же, как и в императивном языке, а также делают лямбду достаточно быстрой. Лямбда также быстро в Smalltalk, который также предназначен для выделения большого количества объектов в куче. В языках, где лямбда была модифицирована, например Perl или Java (внутренние классы связанные с лямбда), расходы могут быть относительно намного выше.

в общем, если язык был разработан с лямбдами в виду, вы можете использовать их столько, сколько вам нравится. Особенно в ML, Caml, Scheme, Haskell,даже анонимные функции дешевы---используйте их много!


лямда - в мире программирования означает анонимную функцию, которая может быть передана и возвращена, как и любая другая нормальная переменная. Так называемые функциональные языки имеют встроенный, но в последнее время растет набор языков, поддерживающих их, так как они позволяют писать многоразовый код. Увидеть это, например, написано в следующей версии C++:

// write this once...
int transform_values(int * values, int n, function<int(int)> f) {
    for(int i = 0; i < n; i++)
        values[i] = f(values[i]);
}

int values[] = { 1, 2, 3, 4 };
// ... then call it to double the values in an array
transform_values(values, 4, [](int v) { return v * 2; });

Он похож на C# и другие языки, поддерживающие lambdas. Теперь есть слово "закрытие". Он означает, что лямбда может захват локальные переменные и использовать их при расчете его результат:

int local_variable = 5;
int values[] = { 1, 2, 3, 4 };
// ... then call it to multiply the values in an array
transform_values(values, 4, [=](int v) { return v * local_variable; });

переменная local_variable Теперь захватывается внутри закрытия и может использоваться внутри него. Переменные также могут обновляться путем закрытия. Lambdas-это базовый строительный блок функциональных языков. Вот пример в haskell:

map (\x -> x * 2) [1, 2, 3, 4]

будет делать то же самое, что и код C++ выше. Он отображает значения в списке, используя данную функцию (лямбда здесь) в список результатов. Используя haskell, вы можете хорошо видеть, как синтаксис используется для отображения математического понятия Лямбда-Исчисление.


лямда означает разные вещи для разных языков. Я знаю о них в контексте python, но я слышал, что python имеет другой подход, чем другие языки.

по сути, в Python, лямбда-выражение-это анонимная функция, которая может состоять только из одного выражения, результат которого возвращается.

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

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


лямбда лямбда-исчисление, но я думаю, что люди используют его с термином закрытие взаимозаменяемо. См.что такое закрытие?

реализация Ruby легко понять и очень мощный. В следующем коде times метод принимает блок кода между фигурными скобками и зовет его обратно HEIGHT раза. Вы можете определить аналогичный метод, который принимает блок кода и реализует цикл construct-ish вещи.

@cells = []
HEIGHT.times { @cells << empty_row }

Я думаю, это более интересно, если есть параметр.

5.times { |i| puts i, " " }