Какова эта 'Лямбда', о которой все продолжают говорить?

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

diff= a - b; return fabs(diff)<EPSILON;

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

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

92
задан Peter Mortensen 30 December 2009 в 12:09
поделиться

12 ответов

Функции без имени

Проще говоря, лямбда - это функция без имени или анонимная функция. Небольшой фрагмент исполняемого кода, который можно передавать, как если бы он был переменной. В JavaScript:

function () {}; // very simple

Давайте теперь посмотрим, как можно использовать эти лямбды.

Абстрагирование шаблонного кода

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

for (var i=0; i<array.length; i++) {
    // do what something useful with array[i]
}

с помощью forEach объектов массива становится:

array.forEach(function (element, index) {
   // do something useful with element
   // element is the equivalent of array[i] from above
});

Приведенная выше абстракция не может Будь это полезно, но есть и другие функции более высокого порядка, такие как forEach , которые выполняют гораздо более полезные задачи. Например, filter :

var numbers = [1, 2, 3, 4];
var even    = [];

// keep all even numbers from above array
for (var i=0; i<numbers.length; i++) {
    if (numbers[i] % 2 === 0) {
        even.push(numbers[i]);
    }
}

alert(even);

// Using the filter method
even = [1, 2, 3, 4].filter(function (number) {
    return number % 2 === 0;
});

alert(even);

Задержка выполнения кода

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

window.onload = function () {
    alert("Loaded");
};

window.setTimeout(function () {
    alert("Code executed after 2 seconds.");
}, 2000);

Это можно было сделать другими способами, но они довольно многословны. Например, в Java есть интерфейс Runnable .

Фабрики функций

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

var users = [];
var getUser = function (name) {
    if (! users[name]) {
        // expensive operations to get a user. Ajax for example
        users[name] = user_from_ajax;
    }

    return users[name];
};

Позже мы можем заметить, что у нас есть похожая функция:

var photos = [];
var getPhoto = function (name) {
    if (! photo[name]) {
        // expensive operations to get a user. Ajax for example
        photos[name] = photo_from_ajax;
    }

    return photos[name];
};

Там явно есть шаблон, поэтому давайте абстрагируемся от него. Давайте использовать мемоизацию .

/**
 * @param {Array}     store Data structure in which we cache lambda's return values
 * @param {Function}  lambda
 * @return {Function} A function that caches the result of calling the lambda param
 */
var memoize = function (store, lambda) {
    // return a new lambda
    return function (name) {
        if (! store[name]) {
            // Execute the lambda and cache the result
            store[name] = lambda(name);
        }

        return store[name];
    };
};

var getUsers = memoize([], function (name) {
    // expensive operations to get a user. Ajax for example
});

var getPhotos = memoize([], function (name) {
    // expensive operations to get a photo. Ajax for example
});

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

Глядя на ваш профиль, я вижу, что вы в основном пользователь Python. Для вышеприведенного шаблона в Python есть концепция декораторов. В сети есть множество примеров для декораторов мемоизации . Единственное отличие состоит в том, что в Python у вас, скорее всего, есть вложенная функция с именем внутри этой функции-декоратора. Причина в том, что Python поддерживает только лямбды с одним выражением. Но концепция та же.

В качестве примера использования лямбда-выражения Python. Приведенный выше код, в котором мы отфильтровали четные числа, может быть представлен в Python следующим образом:

filter(lambda x: x % 2 == 0, [1, 2, 3, 4])

В любом случае, лямбды не так эффективны без замыканий. Замыкания - вот что делает концепцию лямбда настолько мощной. В моем примере с мемоизацией я использовал замыкания для создания замыкания вокруг параметра store . Таким образом, у меня есть доступ к этому параметру даже после того, как функция memoize вернула свой результат (лямбда).

178
ответ дан 24 November 2019 в 06:27
поделиться

Термин «лямбда» используется для обозначения анонимной функции, обычно замыкания . Они полезны, потому что позволяют писать функции, использующие другие функции, без ненужного раздувания кода. Например, в Ruby:

(1..100).select {|num| num % 2 == 0}

Это создаст массив, содержащий четные числа от 1 до 100. Нам не нужно писать явный цикл - метод select принимает функцию, которую он использует для проверки значений, поэтому все, что нам нужно, это наша собственная логика. Это позволяет нам значительно настраивать метод практически без усилий и накладных расходов. По сути, мы можем составлять функции из более мелких функций.

Это простой пример того, что они могут делать.

19
ответ дан 24 November 2019 в 06:27
поделиться

Лямбды в .NET довольно часто называют «синтаксическим сахаром». Они не влияют напрямую на функциональность, но упрощают использование языка людьми.

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

5
ответ дан 24 November 2019 в 06:27
поделиться

«Лямбда» может быть слишком мало. Взгляните на Лямбда-исчисление . Это полезно в функциональном программировании.

А функциональное программирование - это еще одна парадигма программирования (например, процедурная или объектно-ориентированная).

6
ответ дан 24 November 2019 в 06:27
поделиться

Если вы используете Java , вы много слышали о лямбдах или замыканиях за последние пару месяцев, потому что были разные предложения по добавлению этой функции в Java 7. однако я думаю, что комитет отказался от нее. Одно из предложений было сделано Нилом Гафтером и подробно описано здесь: javac.info .

0
ответ дан 24 November 2019 в 06:27
поделиться

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

Открытый ключ, необходимый для проверки подпись будет общеизвестной.

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

Пример кода: (Никогда не публиковать PrivateKey.key. ServerMethods необходимы только при подписании файла xml , лямбда-выражения используются, когда в месте вызова необходимы небольшие и не слишком сложные функции. Если бы функция была нетривиальной, вам нужно было бы не лямбда-выражение, а обычную функцию или функциональный объект ».

2
ответ дан 24 November 2019 в 06:27
поделиться

Также может оказаться полезным взять и прочитать исходный код компилятору. Я сомневаюсь, что GCC - лучший выбор, так как он обременен полной совместимостью с более чем 20-летним развитием языка. Но я также уверен, что чтение его источника, руководствуясь одним из внутренних справочных руководств, будет полезным.

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

Лямбда-выражение x => x * x читается как «x переходит в x, умноженное на x».

из MSDN

0
ответ дан 24 November 2019 в 06:27
поделиться

Полное объяснение лямбда-выражений можно найти также в Википедии . (Прокрутите вниз до раздела Лямбда-исчисление и языки программирования .) Лямбда-выражения не новы, и они не просто часть C #, а то, что было введено в вычисления почти 80 лет назад! Лямбда-выражения - основа функционального программирования.

Это ценность? Что ж, учитывая, что он на самом деле довольно старый, я бы сказал: очень ценен для любого, кто делает вычисления.

0
ответ дан 24 November 2019 в 06:27
поделиться

Здесь вы найдете все, что вам нужно знать (о лямбдах C #) для начала:
Лямбда-выражения

0
ответ дан 24 November 2019 в 06:27
поделиться

Если вы когда-либо работали с функциями / методами, которые используют указатели функций, делегаты, стратегию или шаблон наблюдателя / обработку событий, и думали про себя: «Я пишу всю эту функцию, чтобы использовать это только один раз - чтобы передать его этому методу; я хотел бы просто написать его на месте, а не загромождать свой код »- вот где вы можете использовать Lambda-функции. Языки, поддерживающие эту конструкцию, также обычно в значительной степени используют преимущества концепции передачи функций в качестве параметров, особенно в отношении работы со списками (функции первого класса и функции высшего порядка). Это особенно верно для функциональных языков, которые для вычислений полагаются на композицию функций, а не на изменение памяти. В некоторых случаях (в таких языках, как Python),

2
ответ дан 24 November 2019 в 06:27
поделиться

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

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

Лямбда-выражения делают целесообразным использование обратных вызовов даже для самых крошечных задач, что может сделать код более понятным. Может и нет.

-1
ответ дан 24 November 2019 в 06:27
поделиться

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

Математики и логики склонны использовать странные слова.

«лямбда» звучит действительно эзотерически - как если бы они были очень странной и особенной вещью. На самом деле, если вы пишете JavaScript для приложения веб-браузера и используете идиому "var foo = function () {...}", вы всегда использовали лямбда-функции.

2
ответ дан 24 November 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: