- •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 Монады
Расширим это определение, добавив параллельные подстановки:
Можно рассматривать типовые константы как 0-арные конструкторы, т. е. считать, что int задается как int (). Имея определение подстановки, можно счиать, что тип σ является более общим, чем тип σ' и записывать этот факт как . Это отношение выполняется тогда и только тогда, когда существует набор подстановок θ такой, что σ' = σ θ. Например:
Имеет место:
Теорема 4. Каждый типизируемый терм имеет некоторый основной тип, т. е. если Т :: τ, то существует некоторый σ, такой что Т :: σ и для любого σ', если Т :: σ', то .
Доказательство этой теоремы конструктивно: оно дает конкретную процедуру для поиска основного типа. Эта процедура известна как алгоритм ХиндлиМилнера. Все реализации языков программирования типа Haskell включают в себя вариант этого алгоритма. Выражения в них могут быть сопоставлены их основному типу либо отвергнуты как нетипизируемые.
10.3 Сильная нормализация
Справедлива следующая теорема о сильной нормализации:
Теорема 5. Каждый типизируемый терм имеет нормальную форму и каждая возможная последовательность редукций, начинающаяся с типизируемого терма, завершается.
Функциональная программа, соблюдающая дисциплину типизации, может быть вычислена любым образом, и она всегда завершится в единственной нор-
36