Лямбда-функции - PullRequest
       6

Лямбда-функции

4 голосов
/ 31 мая 2010

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

Это действительно просто функция, встроенная в функцию (, например ) или есть еще что-то за ней?

Ответы [ 5 ]

7 голосов
/ 31 мая 2010

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

И да, они довольно распространены в языках программирования высокого уровня. Например, все функции в JavaScript на самом деле являются лямбда-терминами, хранящимися в переменных.

5 голосов
/ 31 мая 2010

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

В JavaScript (и в языках, которые поддерживают «lambdas» The Right Way), вы можете возвращать функцию из функции, и возвращенная будет иметь возможность доступа к окружающему контексту даже после завершения внешней функции. Пример:

function counter(start){
    return function() {
        return start++;
    };
};

var f = counter(1);
alert( f() ); // now it's 1
alert( f() ); // now it's 2
alert( f() ); // now it's 3
var g = counter(10);
alert( g() ); // now it's 10
alert( g() ); // now it's 11
alert( f() ); // now it's 4!
5 голосов
/ 31 мая 2010

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

map(lambda x: x**2, [1,2,3,4])

Ему не нужно имя; когда вы создаете один с (например, в Python) lambda x: x**2, у вас есть лямбда-функция прямо здесь Сравните это с более обычным:

def square(x):
    return x**2

Возможно, самое главное, вы можете создать их во время выполнения.

def make_exp_function(n):
    return lambda x: x**n

square = make_exp_function(2)
cube = make_exp_function(3)
for i in range(100):
    f = make_exp_function(i)
    print f(2)
3 голосов
/ 31 мая 2010

В лямбда-функциях есть две важные вещи (по крайней мере, как обычно используется термин):

  1. Их можно обойти. Функция может принимать лямбда-функцию в качестве аргумента или возвращать лямбда-функцию.

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

Для базового примера того, как это полезно, я напишу функцию filter на Ruby:

def filter(array, &lambda_function)
  new_array = []
  for item in array
    new_array.push(item) if lambda_function[item]
  end
  return new_array
end

$people_array = #imagine I have an array of Person objects here

def find_people_richer_than(threshold)
  return filter($people_array) {|person| person.wealth >= threshold}
end

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

2 голосов
/ 31 мая 2010

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

Вы можете прикрепить событие в строке Button1_Click += (sender, eventArgs) => { //myCode };

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

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

Это в основном личный выбор, но я должен сказать, что использовал его несколько раз:)

Надеюсь, это немного поможет, Sam

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...