Що таке лямбда-мова?


90

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

Функції JavaScript - це об’єкти першого класу з (переважно) лексичним масштабом. JavaScript - це перша лямбда-мова, яка стала загальноприйнятою. У глибині душі JavaScript має більше спільного з Lisp та Scheme, ніж з Java. Це Лісп в одязі С. Це робить JavaScript надзвичайно потужною мовою.

Я не зрозумів, що таке лямбда-мова. Які властивості такої мови і чим вона відрізняється від таких мов, як Java, C, C ++ та Php?


6
Лямбда означає анонімний вираз. Отже, лямбда-мова -> мова з анонімними виразами
bevacqua

Посилання на Google Books, FYI: books.google.co.uk/…
Лукас Джонс,

3
Див. Лямбда-числення на Вікіпедії.
Почато

багато хороших відповідей. Я зрозумів на сьогоднішній день, якщо ви використовуєте анонімну функцію, тоді ви працюєте над лямбда-мовою. це правильне розуміння того, наскільки мови Lamda відрізняються від такої мови, як Java.
sushil bharwani

4
"Я читав" JavaScript: Гарні частини ", і автор згадує, що JavaScript - це перша з лямбда-мов, яку було запущено". Тож я погуглив лямбда-мову і знайшов це запитання на SO :)
Багс Банні

Відповіді:


38

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

Тим не менш, я підозрюю, що він може мати на увазі:

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

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

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


будь ласка, перегляньте посилання, опубліковане Лукасом Джонсом, посилання на книгу Google, де він переходить на саме ту сторінку, про яку я кажу. спасибі за вашу відповідь.
sushil bharwani

5
Причина, по якій JavaScript описується як "перший", полягає в тому, що в заяві кваліфікується "щоб перейти до основного". Я думаю, цілком зрозуміло, що JavaScript - це дійсно перша мова функціонального стилю, яка використовується щоденними програмістами на щоденних роботах.
rfunduk

1
що ви маєте на увазі, коли говорите "функціональний стиль" мови програмування. Я з рівня Java і намагаюся вивчити javascript, як він відрізняється.
sushil bharwani

9
Це величезна тема для дослідження. Минулого року я був там, де ви зараз: я знайшов есе і лекції Крокфорда і хотів зрозуміти закриття. Я б порадив вам розпочати з Вікіпедії, а потім перейти до кількох нарисів: Джон Хьюз "Чому функціональне програмування має значення" scribd.com/doc/26902/whyfp , Слава Ахмечет "Функціональне програмування для нас усіх" defmacro.org/ramblings /fp.html Існує безліч книг, які допоможуть вам розширити вашу думку: перегляньте «Маленького задумчика», щоб зрозуміти схему, а потім перейдіть до «Структури та інтерпретації комп’ютерних програм».
michiakig,

5
@sushil: по цій темі є багато вступної літератури. Загалом, це стиль програмування, який наголошує на розгляді програм як математичних об'єктів, а не на послідовних інструкціях або взаємодії між абстрактними об'єктами. Наприклад, функціональні мови віддаватимуть перевагу рекурсії перед ітерацією, використовуватимуть незмінні структури даних і використовуватимуть функції вищого порядку, а не "об'єкти функцій" або "шаблони стратегій". Функції вищого порядку означають функції, які можуть працювати (як аргументи) або видавати (як значення, що повертаються) інші функції.
Деррік Турк

48

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

У Java (до версії 8), щоб досягти того самого ефекту, потрібно передати об'єкт, який реалізує інтерфейс, який насправді можна анонімно визначити вбудовано.


1
Хто "широко використовував Lisp"? Я завжди про це знав, оскільки професори завжди це обговорювали, але на практиці я ніколи не зустрічав нікого, хто користувався Lisp. Я б сказав, що кожен міг би знайти когось із своїх знайомих, хто використовував Javascript, що робить Javascript набагато більш «загальноприйнятим».
palswim

"PHP 5 додав підтримку лямбда-функцій". Насправді iy був PHP 5.3, який представив лямбда-функції.
Крозін

Я зустрічав небагатьох людей, які використовували його в бізнес-контексті, але, як колись Паскаль, він широко використовується в освітніх умовах.
Хуан Мендес,

4

Він посилається на числення Лямбди .

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

[...] з нетипізованим лямбда-численням, який є оригінальним натхненням для функціонального програмування, зокрема 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
           }
        }
)

Оновлення

Ява, станом на 8, зараз є офіційно мовою лямбда.

Тепер ви можете використовувати такий синтаксис:

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

Джерело коду


1

У відкритому курсі MIT структура та інтерпретація комп'ютерних програм називається книгою Хела Абельсона, Джері Суссмена та Джулі Сассман. Вони обговорюють схему, яка є діалектом ЛІСП, і там вони пояснюють дуже детальне та чітке пояснення того, що таке лямбда, та схему ЛІСП і мови в цілому. Я настійно рекомендую вам поглянути на нього, якщо ви хочете по-справжньому чітко і глибоко зрозуміти комп'ютерне програмування. Щоб пояснити вам, це зайняло б утричі більше часу, ніж якщо б ви поїхали туди і просто прочитали книгу або переглянули підручники, які це чудово пояснюють, це геній.

Javascript в основному базується на мовній схемі, і це батько Ліспа, а крім того, він взяв свою ламду-структуру і пішов з нею в основу.


0

З Вікіпедії: У мовах програмування, таких як 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

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

  • Властивості: Ця функція потрібна у разі негайного виконання функції або для короткочасного використання, коли немає значення присвоєння імені функції.

  • Він відрізняється від таких мов, як Java, C, C ++ та PHP, оскільки в JS Anonymous функції використовуються для закриття та каррінгу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.