Что такое лямбда-язык? - PullRequest
85 голосов
/ 05 октября 2010

Я читал «JavaScript: хорошие части», и автор упоминает, что JavaScript является первым из лямбда-языков, который будет запущен.

Функции JavaScript - это объекты первого класса с (в основном) лексической областью видимости. JavaScript является первым лямбда-языком , который стал массовым. В глубине души JavaScript имеет больше общего с Lisp и Scheme, чем с Java. Это Лисп в одежде Си. Это делает JavaScript удивительно мощным языком.

Я не понял, что такое лямбда-язык. Каковы свойства такого языка и чем он отличается от языков, таких как Java, C, C ++ и Php?

Ответы [ 7 ]

47 голосов
/ 05 октября 2010

Лямбда-язык, проще говоря, является языком, который позволяет передавать функцию в другую функцию, где функция рассматривается как любая другая переменная. Кроме того, вы должны быть в состоянии определить эту функцию, которая будет передаваться анонимно (или встроено). В PHP 5.3 добавлена ​​поддержка лямбда-функций. Был ли JavaScript первым основным языком? Lisp широко использовался в образовательных средах до JavaScript, а также при настройке нашего любимого Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

Вот пример

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Чем он отличается от C? В C вы можете передавать указатель на функции, но вы не можете определить его анонимно.

В Java (до версии 8) для достижения того же эффекта вы должны передать объект, который реализует интерфейс, который на самом деле может быть определен анонимно встроенным.

36 голосов
/ 05 октября 2010

Я никогда не слышал, чтобы кто-либо использовал термин «лямбда-язык», и единственные правдоподобные определения, о которых я могу подумать, исключают JavaScript как «первый».

Тем не менее, я подозреваю, что он может иметь в виду либо:

  • Функциональные языки: класс языков, в которых вычисления (или могут быть) смоделированы как композиция без состояния (возможно, более высокого порядка) функций. LISP, Scheme, ML, Haskell и т. Д. Часто приписывают этому классу, хотя некоторые из них являются более правильно смешанной парадигмой или «функционально необязательными» языками. Javascript, возможно, содержит необходимые функции, чтобы сделать возможным «функциональный стиль» программирования.
  • Языки, которые позволяют создавать анонимные функции (используя синтаксис function в JavaScript; это написано lambda на многих языках, следовательно, возможно, «лямбда-языки».

Оба использования получены из использования греческой буквы лямбда для обозначения абстракции функций в лямбда-исчислении, модели вычислений, разработанной Алонзо Черчем и на которой основано функциональное программирование.

Редактировать: посмотрел результат Google Книг --- "первым делом мейнстрим"; ну, это спорно. Я бы выдвинул, что LISP был в какой-то момент, по крайней мере, достаточно распространенным. Хотя это справедливо, семантика JavaScript напрямую основана на Scheme, и она, безусловно, охватила большую аудиторию, чем любой другой язык, который может предъявлять подобные требования.

4 голосов
/ 06 октября 2010

Я видел лямбду, определенную как анонимная функция и как ссылка на функцию. Javascript поддерживает оба:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

Именно здесь JS получает большую мощность и гибкость. Java в некоторой степени поддерживает первое (реализации анонимного интерфейса), , но не последнее - см. Ниже обновление для Java 8.

Мне неясно, какое (или оба) из них является правильным определением лямбды.

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

Кстати: в Java анонимный класс обычно используется для передачи определения класса на лету для аргумента (часто используется в разгаре). Примерно так (из памяти, не скомпилировано):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Обновление

Java, начиная с 8, теперь официально является лямбда-языком.

Теперь вы можете использовать следующий синтаксис:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Код источника

4 голосов
/ 05 октября 2010

Он относится к Лямбда-исчислению .

Лямбда-исчисление, также написанное как λ-исчисление, является формальной системой для определения функции, применения функции и рекурсии.[...]

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

1 голос
/ 12 января 2012

В открытом учебном курсе MIT под названием «Структура и интерпретация компьютерных программ» написана книга Хэла Абельсона, Джерри Суссмана и Джули Суссман. Они обсуждают Схему, которая является диалектом LISP, и там они объясняют очень подробное и четкое объяснение того, что такое лямбда, и Схема LISP и языков в целом. Я настоятельно рекомендую вам взглянуть на это, если вы хотите иметь действительно четкое и глубокое понимание компьютерного программирования. Чтобы объяснить вам, потребуется в три раза больше времени, чем если бы вы пошли туда и просто прочитали книгу или посмотрели учебные пособия, которые это прекрасно объясняют, это гений.

Javascript в основном основан на языке Scheme и его отце-лиспе, и кроме того, он взял свою структуру lamda и пошел с ней в русле.

0 голосов
/ 26 октября 2017
  • JavaScript позволяет определить анонимную функцию, которая не привязана к идентификатору.Такая функция также известна как лямбда-абстракция, и, поскольку JS поддерживает ее, она известна как лямбда-язык.

  • Свойства: эта функция необходима в случае немедленного выполнения функции или на короткий срокиспользуйте там, где нет смысла давать имя функции.

  • Он отличается от языков, таких как Java, C, C ++ и PHP, поскольку в JS анонимные функции используются для закрытия и каррирования.

0 голосов
/ 05 октября 2010

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

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...