Что такое лямбда и что такое пример реализации? - PullRequest
6 голосов
/ 17 декабря 2008

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

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

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

Ответы [ 6 ]

12 голосов
/ 17 декабря 2008

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

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.

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

9 голосов
/ 17 декабря 2008

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

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

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

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

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

6 голосов
/ 17 декабря 2008

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

О единственных языках без лямбда *

  • Языки без вложенных функций, такие как Standard C или Icon

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

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

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

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

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

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

5 голосов
/ 17 декабря 2008

лямбда в мире программирования означает анонимную функцию, которую можно передавать и возвращать, как и любую обычную переменную. В так называемых функциональных языках они встроены, но в последнее время растет число языков, поддерживающих их, поскольку они позволяют писать повторно используемый код. Посмотрите на это, например, написано в следующей версии 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 # и другие языки, поддерживающие лямбды. Теперь есть слово «закрытие». Это означает, что лямбда может захватывать локальные переменные и использовать их при вычислении своего результата:

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 теперь захвачена внутри замыкания и может использоваться внутри нее. Переменные также могут быть обновлены закрытием. Лямбды являются основным строительным блоком функциональных языков. Вот пример в haskell:

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

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

2 голосов
/ 17 декабря 2008

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

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

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

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

2 голосов
/ 17 декабря 2008

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

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

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

Полагаю, интереснее, если есть параметр.

5.times { |i| puts i, " " }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...