Який зв’язок між обчисленням лямбда та мовами програмування? [зачинено]


13

Я починаю свій перший рік (в коледжі) з інформатики в наступному році і пишу в основному на мові С (якщо це має значення). Я спробував шукати, але більшість того, що я знаходжу, передбачає знання лямбдального числення. Чому обчислення лямбда вважається настільки кориснішим, ніж однозмінне числення в програмуванні? Чи існує зв’язок між лямбда-виразами та функціональними програмами? Чи вплинула робота Церкви Алонцо над обчисленням лямбда на розвиток мов програмування?

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


2
На це питання краще відповісти на сайті cs.stackexchange.com .
davidk01

@ChrisF. Можливо, це питання краще підходить для одного з сайтів інформатики. Якщо ні, я спробував звузити його і цікавитись, чи можна його відкрити в теперішньому вигляді.
Том Ау

Математика має випічку лямбда, помічена як ніхто, про неї не згадували.
Вільям

Відповіді:


26

Calculus Lambda цікавий, елегантний і значно спрощує розуміння функціональних мов програмування. Однак ви не зіткнетесь з LC на типовому курсі бакалавра CS, тому вам не доведеться зараз його вивчати - я рекомендував би спершу поекспериментувати з функціональними мовами перед переглядом обчислення лямбди. Я вважаю, що OCaml є гарною відправною точкою у функціональному програмуванні для програміста C, і що Схема є гарною відправною точкою для занурення в обчислення лямбди.

Обчислення лямбда не пов’язане з обчисленням (його слід називати Аналіз). Взагалі числення - це "формальна система", тобто сукупність правил, щоб щось робити. У той час як диференціальне обчислення передбачає правила щодо зміни значень, правила обчислення Лямбди описують самі обчислення. З цього набору дуже основних правил ми можемо побудувати довільні обчислення, представлення даних, такі як булеві числа, цілі числа чи списки, і навіть керувати конструкціями потоку, такими як умовні умови або петлі. LC еквівалентний машинам Тьюрінга, але будь-яка модель має різну міцність.

Обчислення лямбди мало неабиякий вплив на мови програмування. Другою мовою високого рівня, яку слід реалізувати, був Lisp, яку можна розуміти як пряме кодування ЖК в мову програмування. Це «функціональне програмування» має величезний вплив на еволюцію мов програмування. Такі функції, як анонімні функції, покажчики функцій, закриття (вкладені функції), збирання сміття, змінна область застосування, метапрограмування, просування в системах типів, умови виводу, інтерпретовані мови, динамічно набрані мови, об'єктно-орієнтоване програмування - все це належить до великої частини до галузі функціонального програмування мов програмування. Існує жарт, що будь-яка нова (неакадемічна) мова програмування лише додає функцій, які Lisp вже мав десятиліттями.

Крім цього, обчислення лямбда та інші пов'язані з цим розрахунки є незамінним інструментом в теорії мови програмування та в певних методах побудови компілятора.

Будь-яка мова, яка має анонімні функції, які ведуть себе як замикання і можуть вільно передаватися навколо, містить кодування зчитування лямбда. Анонімні функції відповідають лямбда-виразам, за винятком того, що у функціях LC завжди є рівно один аргумент. Однак будь-яка мова, повний Тьюрінга, еквівалентна LC, тому LC завжди може бути реалізований поверх таких мов. Це відбувається, як правило, у системах, що відповідають правилам, або у надмірно інтелектуальних форматах конфігурації, що спричиняє “десяте правило Грінспуна” (жартома - здебільшого): “ Будь-яка достатньо складна програма C або Fortran містить спеціальну, неофіційну інформацію, що визначається помилками , повільна реалізація половини Common Lisp. "


Це краща відповідь, ніж та, яку я вибирав раніше. Ваша відповідь дійсно вражає додому. Це саме те, що я шукав!
RonaldMunodawafa

"... за винятком того, що у функціях LC завжди є точно один аргумент": Чи називається ця функція currying або вона принаймні пов'язана з нею?
Джорджіо

@Giorgio Currying відрізняється, але пов'язаний між собою. У LC немає багатоаргументальних функцій, але вони можуть бути просто закодовані як вкладені функції, які беруть один аргумент кожен. Приклад з використанням позначення ML: x = fn (a, b, c) => a + b + c(тип int * int * int -> int, виклик fn (1, 2, 3)) можна перетворити на x = fn a => fn b => fn c => a + b + c(тип int -> int -> int -> int, виклик ((x 1) 2) 3- необов'язковий парен у ML). Тепер замість того, щоб подавати всі три аргументи, ми можемо також надати лише два: plus3 = x 1 2який має тип int -> int. Це часткове нанесення / отримання каррі.
амон

Я думав, що currying означає, що всі функції беруть лише один аргумент (як у LC).
Джорджіо

8

Обчислення лямбда не має нічого спільного з диференціальним / інтегральним численням. Обчислення в найзагальнішому значенні цього слова просто означає систему обчислення.

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

Найбільш безпосередній вплив обчислення лямбда на мови програмування зазвичай виявляється у вигляді функцій і закриттів першого класу. C не підтримує закриття, і тому вам потрібно буде вивчити концепцію на більш високому рівні, як-от Lisp, Python, Ruby, JavaScript тощо. Історично Lisp вважається першою конкретною реалізацією обчислення лямбда як мови програмування .


1
Ви можете згадати конкретні мови, близькі до лямбдального числення, наприклад, Lisp.
Джорджіо

1
Я досі вивчаю Схему за допомогою SICP і сподіваюся, що я дізнаюся більше про цю область. Дякуємо за вашу детальну відповідь та пропозицію.
РональдМунодавафа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.