Что такое лямбда в мире компьютерных наук для человека без опыта работы в области компьютерных технологий?
lambda
language-agnostic
computer-science
terminology
theory
Брайан Варшоу
источник
источник
Ответы:
Лямбда происходит от лямбда-исчисления и относится к анонимным функциям в программировании.
Почему это круто? Это позволяет вам писать функции быстрого выбрасывания, не называя их. Это также обеспечивает хороший способ писать замыкания. С этой силой вы можете делать такие вещи.
питон
Как видно из фрагмента Python, функция adder принимает аргумент x и возвращает анонимную функцию или лямбду, которая принимает другой аргумент y. Эта анонимная функция позволяет вам создавать функции из функций. Это простой пример, но он должен передать силу лямбды и замыкания.
Примеры на других языках
Perl 5
JavaScript
JavaScript (ES6)
Схема
C # 3.5 или выше
стриж
PHP
Haskell
Ява увидеть этот пост
Lua
Котлин
Рубин
Ruby немного отличается тем, что вы не можете вызывать лямбду, используя тот же синтаксис, что и при вызове функции, но он все еще имеет лямбду.
Ruby - это Ruby, для ламбд есть сокращение, поэтому вы можете определить
adder
это следующим образом:р
источник
Лямбда - это тип функции, определенный в строке. Наряду с лямбдой у вас также обычно есть некоторый тип переменной, который может содержать ссылку на функцию, лямбду или другое.
Например, вот фрагмент кода C #, который не использует лямбду:
Это вызывает калькулятор, передавая не только два числа, но и какой метод вызывать внутри калькулятора, чтобы получить результаты расчета.
В C # 2.0 мы получили анонимные методы, которые сокращают приведенный выше код до:
А затем в C # 3.0 мы получили лямбды, которые делают код еще короче:
источник
Op
, можно просто использоватьFunc<int, int>
Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));
для первого примера.Название «лямбда» - это просто исторический артефакт. Все, о чем мы говорим, это выражение, значением которого является функция.
Простой пример (используя Scala для следующей строки):
где аргумент
foreach
метода является выражением для анонимной функции. Вышеприведенная строка более или менее совпадает с написанием чего-то подобного (не совсем реальный код, но вы поймете):за исключением того, что вам не нужно беспокоиться о:
После того, как вы привыкли работать со значениями, необходимость обходиться без них кажется столь же глупой, как и необходимость называть каждое выражение, например:
вместо того, чтобы просто написать выражение, где оно вам нужно:
Точная запись варьируется от языка к языку; Греческий не всегда требуется! ;-)
источник
Это относится к лямбда-исчислению , которое является формальной системой, которая просто имеет лямбда-выражения, которые представляют функцию, которая принимает функцию в качестве единственного аргумента и возвращает функцию. Все функции в лямбда-исчислении относятся к этому типу, т.е.
λ : λ → λ
.Лисп использовал лямбда-концепцию для именования литералов своих анонимных функций. Эта лямбда представляет функцию, которая принимает два аргумента, x и y, и возвращает их произведение:
Это может быть применено в строке, как это (оценивается до 50 ):
источник
λ : λ -> λ
сбивает с толку (и фактически недействительно).Лямбда-исчисление является последовательной математической теорией замещения. В школьной математике можно увидеть, например, в
x+y=5
паре сx−y=1
. Наряду со способами манипулирования отдельными уравнениями также возможно объединить информацию из этих двух, при условии, что подстановки между уравнениями выполняются логически. Лямбда-исчисление кодифицирует правильный способ сделать эти замены.Учитывая, что
y = x−1
это допустимая перестановка второго уравнения, это:λ y = x−1
означает функцию, заменяющую символыx−1
для символаy
. Теперь представьте себе применениеλ y
к каждому члену в первом уравнении. Если термин -y
тогда выполнить замену; иначе ничего не делать. Если вы сделаете это на бумаге, вы увидите, как применять этоλ y
сделает первое уравнение разрешимым.Это ответ без какой-либо информатики или программирования.
Самый простой пример программирования, который я могу придумать, взят из http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works :
Добавлено: http://imgur.com/a/XBHub
источник
Немного упрощено: лямбда-функция - это функция, которая может быть передана другим функциям, и ее логика доступна.
В C # лямбда-синтаксис часто компилируется в простые методы так же, как и анонимные делегаты, но его также можно разбить и прочитать его логику.
Например (в C # 3):
LinqToSql может прочитать эту функцию (x> 15) и преобразовать ее в фактический SQL для выполнения с использованием деревьев выражений.
Заявление выше становится:
Это отличается от обычных методов или анонимных делегатов (которые на самом деле просто магия компилятора), потому что они не могут быть прочитаны .
Не все методы в C #, которые используют лямбда-синтаксис, могут быть скомпилированы в деревья выражений (т.е. фактические лямбда-функции). Например:
Теперь дерево выражений не может быть прочитано - SomeComplexCheck не может быть разбит. Оператор SQL будет выполняться без где и каждая строка в данных будет пропущена
SomeComplexCheck
.Лямбда-функции не следует путать с анонимными методами. Например:
У него также есть встроенная функция, но на этот раз это просто магия компилятора - компилятор C # разделит это на новый метод экземпляра с автоматически сгенерированным именем.
Анонимные методы не могут быть прочитаны, и поэтому логика не может быть переведена, как это возможно для лямбда-функций.
источник
Мне нравится объяснение Lambdas в этой статье: Эволюция LINQ и ее влияние на дизайн C # . Это имело большой смысл для меня, поскольку показывает реальный мир для Lambdas и создает его в качестве практического примера.
Их быстрое объяснение: лямбда-выражения - это способ обработки кода (функций) как данных.
источник
Пример лямбды в Ruby выглядит следующим образом:
Будет генерировать следующий вывод:
источник
На вопрос формально дан большой ответ, поэтому я не буду пытаться добавить больше к этому.
В очень простой, неформальной словах для тех, кто очень мало знает или вообще ничего не знает по математике или программированию, я бы объяснил это как маленький «компьютер» или «ящик», который принимает некоторый ввод, выполняет некоторую работу и производит вывод, не имеет конкретного имени , но мы знаем, где это, и только этим знанием мы используем его.
Практически говоря, для человека, который знает, что такое функция, я бы сказал им, что это функция без имени, обычно помещаемая в точку памяти, которую можно использовать, просто ссылаясь на эту память (обычно с помощью переменная - если бы они слышали о концепции указателей на функции, я бы использовал их как похожую концепцию) - этот ответ охватывает довольно простые основы (без упоминаний о замыканиях и т. д.), но можно легко понять суть.
источник
@ Брайан Я все время использую лямбды в C #, в операторах LINQ и не LINQ. Пример:
До C # я использовал анонимные функции в JavaScript для обратных вызовов функций AJAX, еще до того, как термин Ajax был даже придуман:
Интересная вещь с лямбда-синтаксисом в C #, однако, заключается в том, что сами по себе их тип не может быть выведен (т. Е. Вы не можете ввести var foo = (x, y) => x * y), но в зависимости от того, какой тип они при назначении они будут скомпилированы как делегаты или абстрактные синтаксические деревья, представляющие выражение (именно так средства отображения объектов LINQ выполняют свою «интегрированную в язык» магию).
Лямбды в LISP также можно передать оператору цитаты, а затем проследить в виде списка списков. Некоторые мощные макросы сделаны таким образом.
источник
Вы можете думать об этом как об анонимной функции - вот еще немного информации: Википедия - Анонимная функция
источник
Просто потому, что я не могу увидеть пример C ++ 11 здесь, я продолжу и выложу этот хороший пример отсюда . После поиска, это самый ясный пример конкретного языка, который я смог найти.
Здравствуйте, Lambdas, версия 1
Здравствуйте, Lambdas, версия 2:
источник
У меня проблемы с тем, чтобы обернуть голову вокруг лямбда-выражений, потому что я работаю в Visual FoxPro, которая имеет подстановку макросов и функции ExecScript {} и Evaluate (), которые, похоже, служат одной и той же цели.
Одно из определенных преимуществ использования формальной лямбды - это (я предполагаю) проверка во время компиляции: Fox не будет знать, если вы опечатаете текстовую строку выше, пока не попытается ее запустить.
Это также полезно для кода, управляемого данными: вы можете хранить целые процедуры в памятных полях в базе данных, а затем просто оценивать их во время выполнения. Это позволяет настраивать часть приложения, фактически не имея доступа к источнику. (Но это совсем другая тема.)
источник
Я проиллюстрирую это интуитивно шаг за шагом в простых и удобочитаемых кодах Python.
Короче говоря, лямбда - это просто анонимная и встроенная функция.
Давайте начнем с задания, чтобы понять,
lambdas
как новичок с основами арифметики.План присваивания «имя = значение», см .:
«x», «y» - это имена, а 1, «value» - значения. Попробуйте функцию по математике
Отчеты об ошибках,
вы не можете написать математику непосредственно как код, 'n' должно быть определено или присвоено значению.
Теперь это работает, что если вы настаиваете на объединении двух отдельных строк в одну. Приходит
lambda
Об ошибках не сообщается.
Это взгляд на
lambda
, он позволяет вам написать функцию в одну строку, как вы делаете это в математике непосредственно в компьютер.Мы увидим это позже.
Давайте продолжим копать глубже на «назначение».
Как показано выше, символ равенства
=
работает для простого типа данных (1 и «значение») и простого выражения (n ** 2 + 2 * n + 1).Попробуй это:
Он работает для простых операторов, в Python 7 их 11 типов . Простые операторы - документация Python 3.6.3
Как насчет сложного заявления,
Там
def
включите это работаетТада, проанализируй, «m» - это имя, «n ** 2 + 2 * n + 1» - это значение.
:
это вариант '='.Найдите это, если только для понимания, все начинается с назначения и все является назначением.
Теперь вернемся к
lambda
, у нас есть функция с именем 'm'Пытаться:
Здесь есть два имени 'm', функция
m
уже имеет дублированное имя.Это форматирование как:
Это не умная стратегия, поэтому сообщения об ошибках
Мы должны удалить один из них, установить функцию без имени.
Это называется «анонимная функция»
В заключении,
lambda
в встроенной функции, которая позволяет вам написать функцию в одну прямую линию, как в математикеlambda
является анонимнымНадеюсь это поможет.
источник
Это функция, которая не имеет имени. Например, в C # вы можете использовать
вернуть числа, которые больше 5.
это лямбда-часть здесь. Он представляет функцию, которая принимает параметр (число) и возвращает логическое значение (число> 5). Метод GetMatchingItems использует эту лямбду для всех элементов в коллекции и возвращает соответствующие элементы.
источник
В Javascript, например, функции рассматриваются как же смешанный тип , как и все остальное (
int
,string
,float
,bool
). Таким образом, вы можете создавать функции на лету, назначать их вещам и вызывать их позже. Это полезно, но не то, что вы хотите чрезмерно использовать, иначе вы запутаете всех, кто должен поддерживать ваш код после вас ...Вот код, с которым я играл, чтобы увидеть, как глубоко заходит эта кроличья нора:
источник
В контексте CS лямбда-функция - это абстрактная математическая концепция, которая решает проблему символической оценки математических выражений. В этом контексте лямбда-функция совпадает с лямбда-термином .
Но в языках программирования это нечто другое. Это кусок кода, который объявлен «на месте», и который может быть передан как «первоклассный гражданин». Эта концепция оказалась полезной для того, чтобы она вошла почти во все популярные современные языки программирования (см. Функции лямбда везде ).
источник
Давайте посмотрим, как Lambda (Closure) работает в Swift 4.2 с методом sorted () - от обычной функции до кратчайшего выражения:
1. Нормальная функция
2. Закрытие Выражение
3. Встроенное выражение закрытия
4. Вывод типа из контекста
5. Неявные возвраты из замыканий с одним выражением
6. Сокращенные имена аргументов
7. Операторские методы
Надеюсь это поможет.
источник
Я тоже это получил. Я попробовал это в JS с этим:
Он добавляет от 2 до 4, затем сравнивает результат с 6. Однако иногда мне трудно читать :(
Также я сделал интересную функцию forEach:
Foreach ([1,2,3,4,5]) (console.log);
Этот метод выполняет итерацию массива и выполняет действие - в случае печати на консоль. Теперь я тоже понимаю, почему лабмды сильны.
источник
В компьютерном программировании лямбда - это кусок кода (оператор, выражение или группа из них), который принимает некоторые аргументы из внешнего источника. Это не всегда должна быть анонимная функция - у нас есть много способов их реализовать.
У нас есть четкое разделение между выражениями, утверждениями и функциями, которого нет у математиков.
Слово «функция» в программировании также отличается - у нас есть «функция - это последовательность шагов для выполнения» (от латинского «выполнять»). В математике речь идет о корреляции между переменными.
Функциональные языки стараются быть максимально похожими на математические формулы, и их слова означают почти то же самое. Но в других языках программирования у нас все по-другому.
источник
На вопрос дан полный ответ, я не хочу вдаваться в подробности. Я хочу поделиться использованием при написании численных расчетов в ржавчине.
Есть пример лямбды (анонимная функция)
Когда я писал модуль метода Ньютона-Рафсона, он использовался как производная первого и второго порядка. (Если вы хотите узнать, что такое метод Ньютона-Рафсона, посетите страницу « https://en.wikipedia.org/wiki/Newton%27s_method »).
Выход как следующий
источник
Представьте, что у вас есть ресторан с возможностью доставки, и у вас есть заказ, который нужно сделать менее чем за 30 минут. Суть в том, что клиенты обычно не заботятся о том, отправляете ли вы еду на велосипеде на машине или босиком, пока вы сохраняете еду теплой и связанной. Итак, давайте преобразуем эту идиому в Javascript с анонимными и определенными транспортными функциями.
Ниже мы определили способ доставки, мы также определили имя функции:
Что если бы мы использовали стрелки / лямбда-функции для выполнения этой передачи:
Вы видите, что для клиента нет разницы и нет времени тратить время на размышления о том, как отправить еду. Просто отправь это.
Кстати, я не рекомендую кебаб с коксом, поэтому верхние коды будут давать вам ошибки. Радоваться, веселиться.
источник