22.8. Дополнительные замечания 263
(Appel 1998), Ахо и пр. (Aho et al. 1986), и у Рида (Reade 1989). Чрезвычайно изящное изложение
базовой системы, называемой мини-ML (Clement, Despeyroux, Despeyroux and Kahn 1986) часто служит
основой для технических рассуждений. Тюрин (Tiuryn 1990) рассматривает широкий спектр проблем
в реконструкции типов.
Главные типы не следует смешивать с родственным понятием главной типизации. Разница состоит
в том, что при вычислении главного типа контекст Γ и терм t рассматриваются как входы алгоритма, а
главный тип T служит его выходом. Алгоритм для вычисления главной типизации принимает на входе
только t, а на выходе выдает как Γ, так и T — т. е., он вычисляет минимальные предположения о
типовых переменных в t. Главные типизации оказываются полезны при раздельной компиляции и «оп-
тимальной перекомпиляции», для пошагового вывода типов и поиска ошибок типизации. К сожалению,
во многих языках, включая ML, имеются главные типы, но не главные типизации. См. (Jim 1996).
Полиморфизм в стиле ML, сочетая мощность и простоту, оказывается «наилучшим компромиссом»
в пространстве возможных языковых проектов; его смешение с другими мощными конструкциями ти-
пизации часто бывает весьма нетривиальным. Наибольший успех в этой области — изящное описание
реконструкции типов для записей, предложенное Вандом (Wand 1987) и развитое в работах Ванда
(Wand 1988, 1989b), Реми (R´emy 1989, 1990, 1992a, 1992b, 1998) и многих других. Идея состоит в
том, чтобы ввести новую разновидность переменных, переменные строк, которые имеют значением не
типы, а целые «строки», состоящие из меток и связанных с ними типов. Для решения множеств огра-
ничений, связанных с переменными строк, используется простая форма эквациональной унификации.
См. Упражнение 22.5.6. Гарриге (Garrigue 1994) и другие разработали подобные методы для вариант-
ных типов. Эти методы были распространены на общие понятия классов типов (Kaes 1988; Wadler and
Blott 1989), типов ограничений (Odersky, Sulzmann and Wehr 1999) и специфицированных типов (Jones
1994b,a), которые лежат в основе системы классов типов в языке Haskell (Hall et al. 1996; Hudak et al.
1992; Thopmson 1999); подобные идеи встречаются также в Mercury (Somogyi, Henderson and Conway
1996) и Clean (Plasmeijer 1998).
Уэллс (Wells 1994) показал, что задача реконструкции типов для более богатой формы импреди-
кативного полиморфизма неразрешима. Несколько разновидностей частичной реконструкции типов
для этой системы также оказываются неразрешимыми. В §23.6 и §23.8 приводится дополнительная
информация об этих результатах, и о том, как реконструкция типов в стиле ML сочетается с более
сильными формами вроде полиморфизма 2-го ранга.
Что касается сочетания реконструкции типов в стиле ML и наследования, были опубликованы
некоторые многообещающие результаты (Aiken and Wimmers 1993; Eifrig, Smith and Trifonov 1995;
Jagannathan and Wright 1995; Trifonov and Smith 1996; Odersky, Sulzmann and Wehr 1999; Flanagan and
Felleisen 1997; Pottier 1997), однако практические реализации пока не нашли широкого применения.
Было показано, что распространение реконструкции типов по ML на рекурсивные типы (Глава 20)
не представляет серьезных трудностей (Huet 1975, 1976). Единственное серьезное отличие от алгорит-
мов, приведенных в этой главе, касается определения унификации, где нужно опустить проверку на
вхождение (требующую отсутствия циклов). После того, как это сделано, чтобы по-прежнему гаран-
тировать завершение алгоритма, требуется изменить представление данных и обеспечить разделение
подструктур, например, через деструктивные обновления (возможно, циклических) структур, состоя-
щих из указателей. Такие представления обычны в высокопроизводительных реализациях языков.
С другой стороны, сочетание реконструкции типов с рекурсивно определенными термами ведет
к сложной проблеме, известной под названием полиморфная рекурсия. Простое (и не вызывающее
проблем) правило типизации для рекурсивных определений функций в ML говорит, что рекурсивная
функция может употребляться внутри своего опеределения только мономорфно (т. е., все рекурсив-
ные вызовы должны иметь одни и те же типы аргументов и результатов), в то время как в остальной
программе ее можно использовать полиморфно (с аргументами и результатами различных типов).
Майкрофт (Mycroft 1984) и Мейртенс (Meertens 1983) предложили полиморфное правило типизации,
позволяющее рекурсивным вызовам рекурсивной функции изнутри ее собственного тела конкрети-
зироваться различными типами. Было показано, что в этом расширении, известном как Исчисление
Милнера-Майкрофта, задача реконструкции типов неразрешима (Hengelin 1993, и, независимо от него,
Kfoury, Tiuryn and Urzyczyn 1993a); оба эти доказательства зависят от неразрешимости (неограничен-
ной) задачи полуунификации, которая была показана Кфури, Тюриным и Ужичиным (Kfoury, Tiuryn
and Urzyczyn 1993b).
rev. 104