С помощью этих функций можно избавиться в формулах от переменных, так например свойство комму-
тативности функции
убедиться в том, что:
=
=
=
Все комбинаторы выражаются через комбинаторы
для этих комбинаторов. Обозначения
он переоткрыл комбинаторную логику и существенно развил её. В современной комбинаторной логике для
обозначения комбинаторов
(по Карри).
224 | Глава 14: Лямбда-исчисление
14.3 Лямбда-исчисление с типами
Мы можем добавить в лямбда-исчисление типы. Предположим, что у нас есть множество
Тогда тип это:
Тип может быть либо одним элементом из множества базовых типов. Либо стрелочным (функциональ-
ным) типом. Выражение “терм
Haskell говорит о том, что если у нас есть значение типа
из терма с этим стрелочным типом получить терм типа
Опишем правила построения термов в лямбда-исчислении с типами:
• Переменные
• Если
• Если
• Других термов нет.
Типизация накладывает ограничение на то, какие выражения мы можем комбинировать. В этом есть
плюсы и минусы. Теперь наша система является
ет нормальную форму. Но теперь мы не можем выразить все функции на числах. Например мы не можем
составить
Мы ввели типы, но лишились рекурсии. Как нам быть? Эта проблема решается с помощью введения
специальной константы
, которая обозначает комбинатор неподвижной точки. Правило редукции
для
(
Можно убедиться в том, что это правило роходит проверку типов. Типизированное лямбда-исчисление
дополненное комбинатором неподвижной точки способно выразить все числовые функции.
14.4 Краткое содержание
В этой главе мы познакомились с лямбда-исчислением и комбинаторной логикой, двумя конструктив-
ными теориями функций. Конструктивными в том смысле, что определение функции содержит не набор
значений, а рецепт получения этих значений. В лямбда-исчислении мы видим как функция была построена,
из каких простейших частей она состоит. Редукция термов позволяет вычислять функции.
Мы узнали, что функциями можно кодировать логические значения и числа. Узнали, что все численные
функции могут быть закодированы лямбда-термами.
14.5 Упражнения
• С помощью редукции убедитесь в том, что верны формулы (в терминах Карри) :
=
=
=
=
• Попробуйте закодировать пары с помощью лямбда термов. Вам необходимо построить три функции:
Лямбда-исчисление с типами | 225
=
=
• в комбинаторной логике тоже есть комбинатор неподвижной точки, найдите его с помощью алгоритма
приведения термов лямбда исчисления к термам комбинаторной логики. Для краткости лучше вместо
• Напишите типы Lam и App, которые описывают лямбда-термы и термы комбинаторной логики в Haskell.
Напишите функции перевода из значений Lam в App и обратно.
226 | Глава 14: Лямбда-исчисление
Глава 15
Теория категорий
Многие понятия в Haskell позаимствованы из теории категорий, например это функторы, монады. Теория
категорий – это скорее язык, математический жаргон, она настолько общая, что кажется ей нет никакого
применения. Возможно это и так, но в этом языке многие сущности, которые лишь казались родственными
и было смутное интуитивное ощущение их близости, становятся тождественными.
Теория категорий занимается описанием функций. В лямбда-исчислении основной операцией была под-
становка значения в функцию, а в теории категорий мы сосредоточимся на операции композиции. Мы будем
соединять различные объекты так, чтобы структура объектов сохранялась. Структура объекта будет опреде-
ляться свойствами, которые продолжают выполнятся после преобразования объекта.
15.1 Категория
Мы будем говорить об объектах и связях между ними. Связи принято называть “стрелками” или “мор-
физмами”. Далее мы будем пользоваться термином стрелка. У стрелки есть начальный объект, его называют
В этой записи стрелка
стрелка это функция, а объекты это типы. Мы будем обозначать объекты большими буквами