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


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}S≅T⟺S<:T∧T<:S{ℓ1:A,ℓ2:B}={ℓ2:B,ℓ1:A}Т<:Т

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

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

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


Спасибо за подробный ответ! Другой вопрос: если структурный подтип + параметрический полиморфизм включает в себя типизацию строк + параметрический полиморфизм, зачем вам использовать последний вариант?
— Алекс Р

@AlexR Как упомянул Брайан в своем посте в блоге, субтипирование крайне плохо взаимодействует с выводом типа и многими другими аспектами, такими как проблема эргономики, о которой я упоминал. Также есть проблемы с реализацией и сложностью языка. Чтобы быть справедливым, существует широкое пространство для дизайна как для «типов строк», так и для подтипов, поэтому «subsumes» - грубое утверждение.
— Дерек Элкинс покинул SE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.