Каковы основные различия между полиморфизмом строк и подтипом

20

Я часто слышу, что полиморфизм строк лучше, чем подтипирование, но мне трудно найти что-то, сравнивающее их в деталях. Меня особенно интересует точка зрения пользователя системы.

Я наткнулся на этот пост в блоге, но он оставляет мне больше вопросов, чем раньше. Например, он утверждает, что система с подтипом будет назначать один тип, тогда как система с типизацией строк будет назначать другой; Означает ли это, что если система, которая предположительно имеет подтип, назначает тип «типизирование строки», то это подразумевается неправильно?

Единственное существенное отличие, которое я вижу, состоит в том, что типизация строк позволяет выравнивать типы аргументов (то есть написать функцию с двумя аргументами, которая касается только aполя своих аргументов, но требует, чтобы ее аргументы имели те же поля) ,

Алекс Р
источник

Ответы:

10

Подтип говорит, что, учитывая выражение одного типа, мы можем дать ему также другой тип. Мы говорим, что первый является подтипом второго, и это отношение подтипов вызывает много других отношений. В символах

ΓE:SS<:TΓE:T

Ключевым моментом здесь (и причиной, по которой я его рассмотрел) является то, что одному и тому же выражению присваиваются два разных типа. В параметрический полиморфных языках с неявным типом конкретизацией мы имеем следующее подтипирование зависимости: для всех типов . Если создание экземпляра явно, как в System F, это отношение подтипа не выполняется.T(α.τ)<:τ[T/α]T

Можно сказать, что язык с типами строк (обычно) имеет отношения подтипов в форме порождая где , Однако способ, которым это фактически обрабатывается, заключается в изменении понятия равенства типов (т. Объединения) так, чтобы т.е. они объединяют. В этом случае отношение подтипа является тривиальным one.{1:A,2:B}<:{2:B,1:A}{1:A,2:B}{2:B,1:A}STS<:TT<:S{1:A,2:B}={2:B,1:A}Т<:Т

Обычно, когда мы говорим о языке с подтипами, мы подразумеваем язык с нетривиальными отношениями подтипов на базовых типах, то есть типах без свободных переменных (которые, конечно, могут и будут генерировать отношения подтипов для неосновных типов). Таким образом, система с полиморфизмом строк, как у Роя, не является языком с подтипами в этом смысле, хотя у нее есть нетривиальное отношение подтипов, которое происходит от любого неявно создаваемого параметрического полиморфного языка. Структурный подтип, с другой стороны, явно устанавливает нетривиальные отношения подтипов для основных типов.

Под типами строк я буду подразумевать наличие нетривиального объединения, как описано выше, или его эквивалента. Без этого типы строк - это не больше, чем вложенные кортежи. Обратите внимание, что типы строк не зависят от параметрического полиморфизма; Я не имею в виду переменные строки. Из аргумента о()выше, структурный подтип подразумевает типы строк, но не наоборот. Параметрический полиморфизм является ортогональным (в том смысле, что вы можете иметь или не иметь его, есть определенное взаимодействие) с типами строк или структурными подтипами. Система со структурным подтипом + параметрический полиморфизм включает в себя тип строки + параметрический полиморфизм (при условии какого-то «объединения записей») в том смысле, что каждый член в последнем может быть напечатан с тем же типом в первом. Первый также может печатать с дополнительными типами. Используя пример Брайана, в системе со структурными подтипами и параметрическим полиморфизмом answerбудет иметь тот же тип, что и в версии строки набора текста, но он также будет иметь тип в подтипировании версии в а .

Таким образом, вы, вероятно, хотите сравнить тип строки + параметрический полиморфизм со структурным подтипом без параметрического полиморфизма. Основное преимущество первого (и иногда недостатка) заключается в том, что оно позволяет распространять информацию по всему миру . Когда экземпляр создается все, что когда-либо объединялось с ним. Это может просочиться до корня вашего приложения. Перенос переменных строки через большие участки кода не является редкостью. Подтип подход заключается в том, чтобы забытьρ{ c : Number }информация: переход от подтипа к супертипу теряет (тип) информацию. Часто это может быть тем, что вы хотите: есть общий тип, который вам небезразличен, а все остальное не имеет значения. Я склоняюсь к тому, чтобы поддерживать как можно больше информации о типах и только отбрасывать ее явно. Недостатки подхода подтипирования часто подтверждаются программами, которые являются правильными по типу, но только потому, что типы были помещены в (n без информации) «верхний» тип, например пустую запись. Повторяющийся параметрический полиморфизм (в целом) сохраняет информацию о типе, а подтип намеренно теряет ее.

Дерек Элкинс покинул ЮВ
источник
Спасибо за подробный ответ! Другой вопрос: если структурный подтип + параметрический полиморфизм включает в себя типизацию строк + параметрический полиморфизм, зачем вам использовать последний вариант?
Алекс Р
@AlexR Как упомянул Брайан в своем посте в блоге, субтипирование крайне плохо взаимодействует с выводом типа и многими другими аспектами, такими как проблема эргономики, о которой я упоминал. Также есть проблемы с реализацией и сложностью языка. Чтобы быть справедливым, существует широкое пространство для дизайна как для «типов строк», так и для подтипов, поэтому «subsumes» - грубое утверждение.
Дерек Элкинс покинул SE