Введение

В теории типов, система типов обладает свойством главного типа, если для заданного терма и окружения существует главный тип для этого терма в этом окружении, то есть тип, такой что все остальные типы для этого терма в этом окружении являются экземплярами главного типа. Свойство главного типа является желательным для системы типов, поскольку оно предоставляет способ типизировать выражения в заданном окружении типом, который охватывает все возможные типы выражений, вместо того чтобы иметь несколько несравнимых возможных типов. Вывод типов для систем, обладающих свойством главного типа, обычно стремится вывести главный тип. Например, система ML обладает свойством главного типа, и главные типы выражения могут быть вычислены алгоритмом унификации Робинсона, который используется в алгоритме вывода типов Хиндли-Милнера. Однако многие расширения системы типов ML, такие как полиморфная рекурсия, могут сделать вывод главного типа неразрешимым. Другие расширения, такие как обобщенные алгебраические типы данных в Haskell, разрушают свойство главного типа языка, требуя использования аннотаций типов или заставляя компилятор "угадывать" предполагаемый тип из нескольких вариантов. Свойство главного типирования требует, чтобы для заданного терма существовал типирование (то есть пара, состоящая из контекста и типа), являющееся экземпляром всех возможных типирований этого терма. Свойство главного типирования можно спутать со свойством главного типа, но они различны. Свойство главного типа опирается на контекст как входные данные для определения типа, в то время как свойство главного типирования выдает контекст в качестве результата.