Основной вопрос:
Что делает для нас лямбда-исчисление , что мы не можем сделать с основными свойствами функций и обозначениями, обычно изучаемыми в алгебре средней школы?
Прежде всего, что означает абстрактное в контексте лямбда-исчисления? Мое понимание слова абстрактное - это то, что отделено от механизма, концептуального резюме концепции.
Однако лямбда-функции, покончив с именами функций, предотвращают определенный уровень абстракции. Например:
f(x) = x + 2
h(x, y) = x + 5 y
Но даже не определяя механизм этих функций, мы можем легко говорить об их составе. Например:
1. h(x, y) . f(x) . f(x) . h(x, y) or
2. h . f . f . h
Мы можем включить аргументы, если мы хотим, или мы можем полностью абстрагироваться, чтобы дать обзор того, что происходит. И мы можем быстро свести их к одной функции. Давайте посмотрим на композицию 2. У меня могут быть слои учеников, на которых я могу писать, в зависимости от моего акцента:
g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4
Давайте выполним вышеприведенное с помощью лямбда-исчисления или, по крайней мере, определим функции. Я не уверен, что это правильно, но я верю, что первое и второе выражения увеличиваются на 2.
(λuv.u(u(uv)))(λwyx.y(wyx))x
И умножить на 5лет.
(λz.y(5z))
Вместо того, чтобы быть абстрактным, это, кажется, входит в сам механизм того, что значит добавлять, умножать и т. Д. Абстракция, на мой взгляд, означает более высокий уровень, чем более низкий уровень.
Кроме того, я изо всех сил пытаюсь понять, почему лямбда-исчисление - даже вещь. В чем преимущество
(λuv.u(u(uv)))(λwyx.y(wyx))x
над
h(x) = x + 5 y
или комбинированная запись
Hxy.x+5y
или даже запись Хаскелла
h x y = x + 5 * y
Опять же, что делает для нас лямбда-исчисление, что мы не можем делать со свойствами и обозначениями функции f (x) -тиля, с которыми многие знакомы.
Ответы:
Есть много причин, почему лямбда-исчисление так важно.
Очень важной причиной является то, что лямбда-исчисление позволяет нам иметь модель вычисления, в которой вычислимые функции являются первоклассными гражданами.
Невозможно выразить функции высшего порядка на языке алгебры средней школы.
Возьмите в качестве примера лямбда-выражение
Это простое выражение показывает нам, что в лямбда-исчислении композиция функций сама является функцией. В алгебре средней школы это не так легко выразить.
В лямбда-исчислении очень легко выразить, что функция вернет функцию в качестве результата.
Вот небольшой пример. Выражение (где я здесь предполагаю прикладное лямбда-исчисление с сложением и целочисленными константами)
уменьшится до
Также обратите внимание, что в лямбда-исчислении функции являются выражениями, а не определениями вида . Это освобождает нас от необходимости называть функции и проводить различие между синтаксической категорией выражений и синтаксической категорией определений.е( х ) = е
Кроме того, когда становится невозможным (или просто громоздким) выражать функции более высокого порядка, также возникают проблемы с назначением типов для выражений.
Функциональная композиция имеет полиморфный тип
в системе типов Хиндли-Милнера.
Очень сильным аргументом в пользу лямбда-исчисления является точное представление о типизированном лямбда-исчислении . Системы различных типов для функциональных языков программирования, таких как Haskell и семейство ML, основаны на системах типов для лямбда-исчислений, и эти системы типов предоставляют строгие гарантии в форме математических теорем:
Если программае хорошо типизирована и сводится к остатку e ′ , то e ′ также будет хорошо типизированным.е е' е'
И если хорошо напечатан, то e не будет иметь определенных ошибок.е е
Доказательства в виде программ переписка особенно примечательна. Изоморфизм Карри-Ховарда (см., Например, https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) показывает, что существует очень точное соответствие между простейшим типом лямбда-исчисления и интуиционистской логикой высказываний: каждому типу соответствует логической формуле ϕT . Доказательство ϕ T соответствует лямбда-члену с типом T ,абета-редукция этого члена соответствует выполнению исключения среза в доказательстве.φT φT T
Я призываю тех, кто считает, что алгебра средней школы является хорошей альтернативой лямбда-исчислению, разработать версию алгебры средней школы полиморфного типа высшего порядка вместе с соответствующим понятием изоморфизма Карри-Говарда. Если бы вы даже смогли разработать интерактивный помощник по доказательству, основанный на алгебре средней школы, который позволил бы нам доказать многие теоремы, которые были формализованы с использованием доказательств, основанных на лямбда-исчислении, таких как Coq и Isabelle, это было бы еще лучше. Затем я бы начал использовать алгебру средней школы, и я уверен, что многие другие со мной.
источник
Когда функции впервые описываются подросткам, они по существу отождествляются с графиками (графиками) или, возможно, с формулами; именно так исторически понимались функции до появления формалистических течений в математике. В настоящее время функции, как описано в первый год исчисления, являются вещественные функции, то есть, функции от до R .р р
Функции в лямбда-исчислении гораздо более общие. Точное определение зависит от того, напечатано ли ваше лямбда-исчисление или нетипизировано. В чистом нетипизированном лямбда-исчислении все является функцией. Это гораздо более общее, чем реальные функции исчисления.
Даже процедурные языки иногда используют идеи из лямбда-исчисления. Функция сортировки в C принимает в качестве параметра a сравнения , которую она использует для сравнения элементов. Лямбда-исчисление идет намного дальше - функции не только принимают функции в качестве входных данных, но также могут выводить их.
Лямбда-исчисление представляет собой модель вычисления, эквивалентную по мощности машинам Тьюринга. Это система, полная сама по себе. Чистое лямбда-исчисление не имеет «5» или «+» в качестве примитивных терминов - они могут быть определены внутри исчисления, так же как «5» и «+» не являются примитивами теории множеств. (Практические языки программирования реализуют натуральные числа по соображениям эффективности.)
Я подозреваю, что одной из причин, по которой вы не впечатлились лямбда-исчислением, является то, что его идеи настолько проникли в программный дискурс, что он больше не выглядит инновационным.
источник
Использование лямбда-выражений в языках программирования имеет аналогичное преимущество; вы можете написать, что функция делает прямо там, где это необходимо, вместо того, чтобы определять совершенно новую функцию где-то в вашей программе.
Многие люди считают эту запись двойной оценки запутывающей и / или тревожной, а также это рекурсивное использование точечного определения функции. Лямбда-версия абстракции
не имеет этой проблемы
Наконец, существует теорема абстрактной бессмыслицы о том, что «просто типизированное лямбда-исчисление» по сути то же самое, что и «декартово замкнутая категория» - так что, если вы когда-нибудь захотите выполнить вычисление в декартовой замкнутой категории, возможно, это хорошая идея использовать просто набрал лямбда-исчисление, чтобы сделать это.
источник
Скажу сразу, я не эксперт по этой теме, но я потратил немного времени на его изучение, и одна из самых интересных вещей для меня в любой теме - это история. Таким образом, понимание части истории лямбда-исчисления помогает объяснить, почему оно полезно.
Краткое резюме состоит в том, что в начале 1900-х годов после того, как теория множеств начала развиваться, и математика была переосмыслена на основе множеств, некоторые математики заметили, что хотя определение теории множеств позволяет утверждать, что определенная структура существует, они не говорят вам, как построить и рассчитать это. Таким образом, теоретико-множественные определения неконструктивны . Математики начали задаваться вопросом, есть ли способ разработать конструктивные определения, которые выходят за рамки доказательства того, что что-то есть, и вместо этого доказывают, как оно есть .
Из Википедии :
Затем было показано, что лямбда-исчисление и машина Тьюринга могут представлять любую вычислимую функцию и, таким образом, эквивалентны.
Теоретически любая математическая функция или концепция может быть закодирована в форме лямбда-исчисления и вычислена. Это означает, что лямбда-исчисление может быть совершенно отдельным основанием для математики, хотя, очевидно, чрезвычайно утомительным.
Лямбда-исчисление не является «полезным» в том смысле, что вы не собираетесь писать код с его использованием, но оно формирует основу для денотационной семантики, которая используется для описания программ и их динамических эффектов. Это используется в обсуждениях правильности программы и семантического значения. Это также явно сильно повлияло на разработку функциональных языков программирования, которые черпают всю свою концепцию исполнения из лямбда-исчисления.
Надеюсь, это поможет.
Изменить, чтобы добавить: я только что указал на этот документ, показывающий связь между топологией, лямбда-исчислением и физикой. Кратко рассмотрев это, я наткнулся на это фантастическое утверждение:
Дело в том, что лямбда-исчисление является идеализированной моделью вычислений программного обеспечения, и поэтому не привязано к конкретной реализации в любом языке программирования. Он моделирует чистые вычисления .
источник
источник
Лямбда-исчисление не было разработано, чтобы быть языком программирования. Действительно, он был создан в 1930-х годах, за десятилетия до того, как у нас появились программируемые компьютеры. Скорее, он был создан как формальная модель для изучения вычислений. Если вы разочарованы тем, как легко он выражает код или математические функции, это потому, что это не то, для чего он нужен.
источник
Лямбда-исчисление существует, так что можно создавать анонимные (лямбда-функции) функции. Если вы не покончите с именами функций, тогда пространство имен может быть загромождено, и у вас могут закончиться доступные имена функций. Это особенно важно при работе с так называемыми «функциями более высокого порядка», которые по понятным причинам возвращают функции (или указатели на функции).
По сути, лямбда-функции эквивалентны переменным локальной области видимости. Функциональное программирование без лямбда-функций аналогично процедурному программированию без каких-либо локальных переменных, то есть ужасной идеи.
«Почему лямбда-исчисление является даже вещью», математики любят избыточность. Лямбда-исчисление редко используется в математике, потому что, как вы обнаружили, нотация не очень полезна.
«Если бы вы могли даже разработать интерактивного помощника по доказательству, основанного на алгебре средней школы, который позволил бы нам доказать многие теоремы, которые были формализованы с использованием доказательств на основе лямбда-исчисления, таких как Coq и Изабель, это было бы еще лучше. затем начните использовать алгебру средней школы, и я уверен, что многие другие со мной ". Вы слышали о метамате? Никакое лямбда-исчисление там не может доказать многие из теорем Кок / Изабель
источник
let
, но хотя ониlet
могут быть закодированы анонимными функциями, вы явно не можете пойти другим путем. Функциональное программирование не требует «лямбда-функций», например, Backus ' FP или Sisal .