Подтип говорит, что, учитывая выражение одного типа, мы можем дать ему также другой тип. Мы говорим, что первый является подтипом второго, и это отношение подтипов вызывает много других отношений. В символах
Γ ⊢ E: SS< : TΓ ⊢ E: T
Ключевым моментом здесь (и причиной, по которой я его рассмотрел) является то, что одному и тому же выражению присваиваются два разных типа. В параметрический полиморфных языках с неявным типом конкретизацией мы имеем следующее подтипирование зависимости:
для всех типов . Если создание экземпляра явно, как в System F, это отношение подтипа не выполняется.T( ∀ α . Τ) < : τ[ T/ α]Т
Можно сказать, что язык с типами строк (обычно) имеет отношения подтипов в форме порождая где , Однако способ, которым это фактически обрабатывается, заключается в изменении понятия равенства типов (т. Объединения) так, чтобы т.е. они объединяют. В этом случае отношение подтипа является тривиальным one.{ ℓ1: A , ℓ2: B } < : { ℓ2: B , ℓ1: A }{ ℓ1: A , ℓ2: B } ≅{ ℓ2: B , ℓ1: A }S≅Т⟺S< : T∧ T< : S{ ℓ1: A , ℓ2: B } = { ℓ2: B , ℓ1: A }Т< : T
Обычно, когда мы говорим о языке с подтипами, мы подразумеваем язык с нетривиальными отношениями подтипов на базовых типах, то есть типах без свободных переменных (которые, конечно, могут и будут генерировать отношения подтипов для неосновных типов). Таким образом, система с полиморфизмом строк, как у Роя, не является языком с подтипами в этом смысле, хотя у нее есть нетривиальное отношение подтипов, которое происходит от любого неявно создаваемого параметрического полиморфного языка. Структурный подтип, с другой стороны, явно устанавливает нетривиальные отношения подтипов для основных типов.
Под типами строк я буду подразумевать наличие нетривиального объединения, как описано выше, или его эквивалента. Без этого типы строк - это не больше, чем вложенные кортежи. Обратите внимание, что типы строк не зависят от параметрического полиморфизма; Я не имею в виду переменные строки. Из аргумента о( ≅)выше, структурный подтип подразумевает типы строк, но не наоборот. Параметрический полиморфизм является ортогональным (в том смысле, что вы можете иметь или не иметь его, есть определенное взаимодействие) с типами строк или структурными подтипами. Система со структурным подтипом + параметрический полиморфизм включает в себя тип строки + параметрический полиморфизм (при условии какого-то «объединения записей») в том смысле, что каждый член в последнем может быть напечатан с тем же типом в первом. Первый также может печатать с дополнительными типами. Используя пример Брайана, в системе со структурными подтипами и параметрическим полиморфизмом answer
будет иметь тот же тип, что и в версии строки набора текста, но он также будет иметь тип в подтипировании версии в а .
Таким образом, вы, вероятно, хотите сравнить тип строки + параметрический полиморфизм со структурным подтипом без параметрического полиморфизма. Основное преимущество первого (и иногда недостатка) заключается в том, что оно позволяет распространять информацию по всему миру . Когда экземпляр создается все, что когда-либо объединялось с ним. Это может просочиться до корня вашего приложения. Перенос переменных строки через большие участки кода не является редкостью. Подтип подход заключается в том, чтобы забытьρ{ c : Number }
информация: переход от подтипа к супертипу теряет (тип) информацию. Часто это может быть тем, что вы хотите: есть общий тип, который вам небезразличен, а все остальное не имеет значения. Я склоняюсь к тому, чтобы поддерживать как можно больше информации о типах и только отбрасывать ее явно. Недостатки подхода подтипирования часто подтверждаются программами, которые являются правильными по типу, но только потому, что типы были помещены в (n без информации) «верхний» тип, например пустую запись. Повторяющийся параметрический полиморфизм (в целом) сохраняет информацию о типе, а подтип намеренно теряет ее.