Что такое лямбда и что такое пример реализации?
Я довольно новичок в программировании, и, делая много чтения этой концепции лямбда продолжает придумывать, но мне трудно понять, что это на самом деле и как его реализация сделает мою жизнь программирования намного лучше. Итак, во-первых, что такое лямбда и во-вторых, как она может быть реализована?
спасибо всем, кто написал. Как уже упоминалось в комментариях, это дубликат, но здесь так много отличных ответов, которые я хочу сохранить для сообщество, поэтому я превращаю его в общественный пост. Вот ссылка на другой вопрос:
6 ответов
лямбда трудно поймать, но как только вы их представили, вы не можете понять, почему вы не получили его раньше.
Lamdba являются анонимными функциями
лямбда-это обычные функции, единственная разница заключается в том, что вы не даете им имя.
чтобы понять это, вы должны сначала знать, что при создании функции код хранится в памяти по адресу, известному только компьютеру.
поэтому, когда вы делаете что-то вроде что :
function Foo ()
{
/* your code here */
}
то, что вы действительно делаете, это привязка имени "Foo" к адресу кода в памяти.
Теперь есть другой способ доступа к адресу:ссылки (и указатели, но давайте пропустим этих противных парней)
Ну, лямбда-функция-это функция, у которой нет имени, поэтому это может быть только доступ с ее ссылкой.
как вы их используете ?
при создании лямбда-функции,вы обычно планируете используйте его только один раз.
шаг за шагом процесс, как правило :
- создать функции
- ссылку
- передайте ссылку где-нибудь, где она будет использоваться
наконец, ссылка теряется, и поэтому функция уничтожается автоматически.
типичным случаем использования является функция обратного вызова. Вы объявляете, создаете и передаете функцию в одной строке, поэтому это удобно.
пример из настоящее слово
в 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, " " }