Назвіть основні відмінності між рядковим поліморфізмом та підтипом


20

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

Я натрапив на цю публікацію в блозі, але це залишає у мене більше запитань, ніж раніше. Наприклад, він стверджує, що системі з підтипом буде призначено один тип, тоді як система з типізацією рядків призначить інший; чи означає це, що якщо система, яка нібито має підтипізацію, призначає тип "набір рядка", вона вважає неправильним?

Я бачу одну головну різницю в тому, що введення рядків дає можливість вирівняти типи аргументів (тобто написати дві функції аргументів, які стосуються себе лише aполя його аргументів, але вимагають, щоб аргументи мали однакові поля) .

Відповіді:


10

Підтипування говорить, що, висловивши один тип, ми можемо дати йому також інший тип. Ми кажемо, що перший є підтипом останнього, і це відношення підтипів викликає багато інших відносин. У символах

ΓЕ:SS<:ТΓЕ:Т

Тут головне (і причина, яку я переглянув) полягає в тому, що одне і те ж вираз дає два різних типи. У параметричний поліморфних мовами з неявним типом конкретизацією ми маємо наступне співвідношення: підтипи для всіх типів Т . Якщо екземпляр типу явний, як у System F, це відношення підтипів не виконується.(α.τ)<:τ[Т/α]Т

Як трохи убік, ми можемо сказати, що мова з типами рядків (як правило) має підтипові відносини форми що породжує до { 1 : A , 2 : B } { 2 : B , 1 : A }, де S {1:А,2:Б}<:{2:Б,1:А}{1:А,2:Б}{2:Б,1:А} . Однак, як це реально реалізується, це шляхом зміни поняття рівності типів (тобто об'єднання) так, що { 1 : A , 2 : B } = { 2 : B , 1 : A } , тобто вони об'єднуються . У цьому випадку залежність підтип тривіальне Т < : Т один.SТS<:ТТ<:S{1:А,2:Б}={2:Б,1:А}Т<:Т

Зазвичай, коли ми говоримо про мову з підтипом, ми маємо на увазі ту, яка має нетривіальне співвідношення підтипів для основних типів, тобто типів без вільних змінних (що, звичайно, може і породжувати підтипові зв'язки для неземних типів). Таким чином, система з поліморфізмом рядків, як Роя, не є мовою з підтипом у цьому сенсі, хоча вона має нетривіальне підтипове відношення, яке походить від будь-якої неявно інстанційованої параметричної поліморфної мови. Структурне підтипування, з іншого боку, прямо визначає нетривіальні відносини підтипів для основних типів.

Під типами рядків я маю на увазі наявність нетривіальної уніфікації, як описано вище, або еквівалент. Без цього типи рядків трохи більше, ніж вкладені кортежі. Зауважте, типи рядків не залежать від параметричного поліморфізму; Я не маю на увазі змінних рядків. З аргументу про ()вище структурне підтипування передбачає типи рядків, але не навпаки. Параметричний поліморфізм є ортогональним (у тому сенсі, якщо ви його можете мати чи не мати, то, безумовно, є взаємодії) для типів рядків або структурних підтипів. Система зі структурним підтипом + параметричний поліморфізм включає тип рядка + параметричний поліморфізм (припускаючи якийсь "союз запису") в тому сенсі, що кожен член в останньому може бути введений з одним типом у першому. Перший просто може вводити і додаткові типи. Використовуючи приклад Брайана, в системі зі структурними підтипами і параметричних поліморфізмом answerматиме той же тип, що і у версії рядка набору тексту, але він також буде мати тип в подтіпірованіі версії в а .

ρ{ c : Number }інформація: перехід від підтипу до супертипу втрачає (тип) інформацію. Часто це може бути саме тим, що ви хочете: є загальний тип, який вам цікавий, а все інше - це несуттєві деталі. Моя упередженість полягає у підтримці якомога більшої кількості типів інформації, а лише явно відкидання. Про недоліки підходу підтипу часто свідчать програми, які мають правильний тип, але лише тому, що типи були висунуті до (n інформаційного) "верхнього" типу, наприклад, до порожнього запису. Повторюючись, параметричний поліморфізм (загалом) зберігає інформацію про тип, підтипуючи навмисно втрачаючи її.


Дякую за детальну відповідь! Ще одне питання: якщо структурна підтипізація + параметричний поліморфізм включає типізацію рядків + параметричний поліморфізм, чому б ви коли-небудь використовували останні?
Alex R

@AlexR Як згадував Брайан у своїй публікації в блозі, підтипізація надзвичайно погано взаємодіє з висновками про тип та багатьма іншими аспектами, такими як ергономічна проблема, яку я згадав. Також є питання щодо впровадження та складності мови. Для справедливості існує широкий простір дизайну як для "типів рядків", так і для підтипів, тому "підрозділи" є грубим твердженням.
Дерек Елкінс покинув SE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.