- •1 Понятие языка программирования (неформально)
- •2 Эволюция языков программирования
- •3 Классификация языков программирования
- •4 Среда программирования
- •4.1 Понятие среды программирования
- •4.2 Техника разработки программ
- •4.3 Классификация ошибок в программе
- •4.4 Отладка
- •5. Основные виды языков программирования
- •6 Лямбда-исчисление как формализация функциональных языков
- •7 Лямбда-исчисление как формальная система
- •7.1 Свободные и связанные переменные
- •7.2 Подстановки
- •7.3 Конверсия
- •7.4 Равенство лямбда-термов
- •7.5 Экстенсиональность
- •7.6 Редукция лямбда-термов
- •7.7 Редукционные стратегии
- •8 Комбинаторы
- •9 Лямбда-исчисление как язык программирования
- •9.1 Представление данных в лямбда-исчислении
- •9.1.1 Булевские значения и условия
- •9.1.2 Пары и кортежи
- •9.1.3 Натуральные числа
- •9.2 Рекурсивные функции
- •9.3 Именованные выражения
- •10 Типы
- •10.1 Типизированное лямбда-исчисление
- •10.1.1 Базовые типы
- •10.1.2 Типизации по Черчу и Карри
- •10.1.3 Формальные правила типизации
- •10.2 Полиморфизм
- •10.2.1 let-полиморфизм
- •10.2.2 Наиболее общие типы
- •10.3 Сильная нормализация
- •11 Отложенные вычисления
- •12 Классы типов
- •13 Монады
10.1.3 Формальные правила типизации
Эти правила являются индуктивным определением отношения типизируемости. Для примера рассмотрим типизирование функции идентичности λх. х. По правилу для переменных имеем:
и отсюда по последнему правилу получаем:
Всилусоглашенияопустыхконтекстах получаемλх. х:: σ—> σ. Можно показать, что все преобразования лямбда-термов сохраняют типы.
10.2 Полиморфизм
Система типов по Карри обеспечивает полиморфизм, в том смысле, что терм может иметь различные типы. Необходимо различать концепции полиморфизма и перегрузки. Оба этих термина означают, что выражение может иметь несколько типов. Однако в случае полиморфизма все типы сохраняют струкурное сходство. Например, функция идентичности может иметь тип σ—> σ, τ—> τ или(σ —>τ) —> (σ—> τ). При перегрузке функция может иметь различные типы, не связанные друг с другом структурным сходством.
10.2.1 let-полиморфизм
Рассмотренная система типов приводит к некоторым ограничениям на полиморфизм. Например, приемлемо следующее выражение:
if (λx. x) true then (λx.x) 1 else 0
Если использовать правила типизации, то можно получить, что это выражение
34
имеет тип int. Два экземпляра функции идентичности имеют типыbool —>bool и int —> int соответственно.
Рассмотрим выражение:
let I = λx. x in if I true then I 1 else 0
Согласно определению, это иной способ записи для
(λI. if I true then I 1 else 0) (λx. x)
Однако это выражение не может быть типизировано. В нем присутствует единственный экземпляр функции идентичности, и он должен иметь единственный тип.
Для преодоления этого ограничения добавим правило типизации, в котором let-конструкции рассматривается как первичная:
Это правило определяет let-полиморфизм.
10.2.2 Наиболее общие типы
Некоторые выражения не имеют типа, например, λf. f f или λf. (f true, f.1) Типизируемые выражения обычно имеют много типов, хотя некоторые имеют только один.
Имеет место утверждение: для каждого типизируемого выражения существует наиболее общий тип или основной тип, и все возможные типы выражения являются экземплярами этого наиболее общего типа. Прежде чем сделать это утверждение строгим, необходимо ввести некоторую терминологию.
Введем понятие типовых переменных. Типы могут быть сконструированы с помощью применения конструкторов типа либо к типовым константам, либо к переменным. Будем использовать буквы α и β для типовых переменных, а σ и τ - для произвольных типов. Определим понятие замены типовой переменной на некоторый тип. Будем использовать ту же нотацию, что и при подстановке термов. Например:
(σ —> bоо1)[ σ := (σ —> τ)] = (σ —> τ)—> bool
35