344 29.2. Определения
свести тип вроде Tyop Nat к редуцированной форме Nat Nat, явно помечено в программе благодаря
присутствию tyoptag. Это существенно упрощает алгоритм проверки типов.
3
Здесь мы рассматриваем только один конструктор видов, . Однако в литературе исследовалось
и множество других; спектр систем видообразования, способных проверять и отслеживать различные
свойства типовых выражений, сравним со спектром систем типов, проверяющих и отслеживающих
свойства термов. Имеются виды записей (их элементами являются записи типов — которые не следует
путать с типами записей; через такие виды естественным образом определяются системы взаимно ре-
курсивных типов), строковые виды (описывающие «строки полей»; с их помощью можно сконструиро-
вать типы записей в системах, поддерживающих полиморфизм через переменные строк — см. стр. 263),
степенные виды, они же степенные типы (через них строится альтернативный подход к наследованию,
см. Cardelli 1988a), одноэлементные виды (связанные с определениями — см. стр. 340, а также с систе-
мами модулей с разделением — см. стр. 356), зависимые виды («высокоуровневый» аналог зависимых
типов, описываемых в §30.5), и многие другие.
29.2. Определения
Полное определение базового лямбда-исчисления с операторами над типами приведено на Рис. 29.1.
На уровне термов это исчисление включает только переменные, абстракцию и применение из про-
стого типизированного лямбда-исчисления (и поэтому называется простое типизированное лямбда-
исчисление с операторами над типами). На уровне типов мы имеем обыкновенные функциональные
типы и типовые переменные, а также абстракцию и применение операторов. Кванторные типы вроде
X.T в эту систему не включены; мы подробно их рассмотрим в Главе 30.
Наше представление системы с видами расширяет конструкцию простого типизированного лямбда-
исчисления в трех отношениях. Во-первых, вводится набор правил присвоения видов, указывающих,
как можно сочетать выражения типа и получать при этом новые выражения типа. Запись Γ T :: K
означает «тип T принадлежит виду K в контексте Γ». Обратите внимание на сходство этих правил с
правилами типизации для исходного простого типизированного лямбда-исчисления (Рис. 9.1).
Во-вторых, каждый раз, когда внутри терма встречается тип T (в форме λx:T.t), требуется прове-
рить, правильно ли T образован. Поэтому к старому правилу T-Abs добавляется новая предпосылка,
Γ T :: *. Заметим, что T должен иметь в точности вид * — т. е., это должен быть простой тип, —
поскольку он используется для характеристики значений, которые разрешено принимать переменной
x. Правила типизации соблюдают инвариант, что всякий раз, когда мы можем вывести утверждение
Γ t : T, выводимо будет и утверждение Γ T :: (при условии, что все упоминаемые в контексте
типы имеют правильные виды). Этот момент подробнее обсуждается в §30.3.
В-третьих, добавляется набор правил, касающихся отношения эквивалентности определений меж-
ду типами. Мы пишем S T, что читается «определения типов S и T эквивалентны». Это отношение
весьма похоже на отношение редукции на уровне термов. Влияние эквивалентности определений на
типизацию отражено в новом правиле T-Eq. Предпосылка о видах (опущенная в предыдущем разделе,
где мы обсуждали это правило) поддерживает вышеупомянутый инвариант, «термы с правильными
типами всегда имеют типы с правильными видами». Заметим, что это правило похоже на правило
включения (T-Sub) в системах с наследованием.
Для доказательства основных метатеоретических свойств этой системы требуется некоторая работа,
поскольку отношение эквивалентности между типами ведет к немалой гибкости в «формах» типов,
присваиваемых термам. Мы откладываем исследование этой теории до Главы 30.
3
Это ограничение подобно тому, как в ML обрабатываются рекурсивные типы (см. §20.1). Объединение рекурсивных
типов с определениями datatype дает программисту удобство эквирекурсивных типов, а компилятору простоту изоре-
курсивных, поскольку аннотации fold/unfold упрятываются в операции пометки и разбора случаев, необходимые при
работе с вариантными типами.
rev. 104