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