Что такое лямбда-язык?

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

Лямбда-язык простым языком является языком, который позволяет передавать функцию другой функции, где функция рассматривается как любая другая переменная. Кроме того, вы должны иметь возможность определить эту функцию для передачи анонимно (или встроенного). 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 вы можете передать указатель на функции, но вы не можете определить его inline анонимно.

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

Ответ 3

Он ссылается на Lambda calculus.

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

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

Ответ 4

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

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

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

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

Неясно, для кого (или и того и другого) это правильное определение лямбда.

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

BTW: В Java анонимный класс обычно используется для передачи определения класса "на лету" для аргумента (используется много в swing). Что-то вроде этого (из памяти, а не скомпилировано):

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

Update

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

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

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

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

Ответ 5

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

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

Ответ 6

Из Википедии: В языках программирования, таких как 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

Ответ 7

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

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

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