Назвіть найсильніші системи відомого типу, для яких умовивід визначальний?


22

Добре відомо, що умовивід типу Хіндлі-Мілнера (просто набраний -калькулятор з поліморфізмом) має визначальний тип висновку: ви можете реконструювати принципові типи для будь-яких програм без будь-яких анотацій.λ

Додавання класів типів Haskell схоже на збереження цього рішення, але подальше доповнення робить висновок без приміток непридатним (сімейства типів, GADT, залежні типи, типи Rank-N, система тощо)ω

Мені цікаво: які найсильніші відомі системи типу з цілком вирішимим висновком? Він буде лежати десь між Хіндлі-Мілнером (повністю вирішальним) та залежними типами (абсолютно не визначимо). Чи можуть бути додані аспекти DT, які зберігають рішення для висновку? Які дослідження були зроблені, щоб побачити, наскільки це можна просунути?

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

Редагувати: враховуючи, що не існує "найсильнішої" системи, я прийму відповідь, яка окреслює помітні системи, що розширюють Хіндлі Мілнер з вирішальним висновком. Прикладами можуть бути типи рідини, ранг-2 тощо.


4
@jmite Я згоден з іншими тут. Дійсно не відома межа чіткого розрізу. Сумніваюсь, що може бути. Висновок типу вирішуваності дійсно залежить від усіх мовних особливостей, наприклад, ви підгрупували чи ні. Одну межу чіткого розрізу можна знайти у розширеннях HM з вищими рангами типів, де нам відомо: для рангу k> 2 не можна визначити умови вибору, інакше це можна вирішити.
Мартін Бергер

@MartinBerger Я погоджуюсь, що немає найсильнішого, але я думаю, що все-таки є хороша відповідь, яка повинна бути окреслити помітних, як, наприклад, Ранг-2, який ви згадуєте.
jmite

1
@jmite Було б здорово скласти збірник дешифрованості для виведення типу. Немає такого, все це на жаль розповсюджується близько 100 сотень паперів. Можливо, ви можете написати один, це було б чудовою послугою для громади.
Мартін Бергер

Мені здається, що написання відповіді на питання може бути важким, але, безумовно, нещодавній вид висновку Дідьє Ремі (разом із його посиланнями) може зацікавити запитувача.
ejgallego

Відповіді:


2

[РЕДАКТУЙТЕ: Вуалюйте кілька слів на кожному]

Існує кілька способів розширення умовиводу типу HM. Моя відповідь ґрунтується на багатьох, більш-менш успішних спробах реалізації деяких з них. Перший, на який я натрапив, - це параметричний поліморфізм . Системи типів, які намагаються поширити HM в цьому напрямку, схиляються до системи F і тому вимагають анотацій типу. Два помітних розширень у цьому напрямку, на які я натрапив, є:

  • HMF, він дозволяє зробити висновок про типи для всіх типів System-F, а це означає, що ви можете мати універсальне кількісне визначення "в середині" типу, їх поява неявно не розташоване на найвищому обсязі, як для поліморфних типів HM. У документі чітко зазначено, що не існує чіткого правила щодо того, скільки та де тип приміток може знадобитися. Також типи, що належать до системи F, терміни зазвичай не мають головного типу.

  • MLF - це не лише розширення HM, це також розширення системи F, яка повертає властивість основного типу HM шляхом введення свого роду обмеженого кількісного визначення за типами. Авторами було проведено порівняння, MLF суворо потужніший, ніж HMF, а примітки потрібні лише для параметрів, які використовуються поліморфно.

Інший спосіб розширення HM - через зміну області обмеження.

  • HM (X) - параметр Гіндлі-Мілнера, що параметризується над областю обмеження X. У цьому підході алгоритм HM генерує обмеження, які надсилаються до вирішувача домену для X. Для звичайного HM вирішувач домену - це процедура об'єднання, і домен складається набору строків, побудованих із типів та змінних типів.
    Іншим прикладом для X можуть бути обмеження, виражені мовою арифметики Пребургера (у цьому випадку виведення / перевірка типу вирішується) або мовою арифметики Пеано (більше не можна визначити). X змінюється в різних спектрах теорій, кожна з яких має власні вимоги щодо кількості та локалізації необхідних анотацій типу та починає від них зовсім не до всіх.

  • Класи типів Haskell також є своєрідним розширенням домену обмеження шляхом додавання предикатів типу форми MyClass(MyType)(означає, що існує екземпляр MyClass для типу MyType).
    Класи типів зберігають умовивід типу, оскільки вони є в основному (майже) ортогональними поняттями, в яких реалізується адмоковий поліморфізм .
    В якості прикладу візьмемо символ valтипу , val :: MyClass a => aдля яких ви можете мати примірників MyClass A, і MyClass Bт.д. Якщо ви посилаєтеся на цей символ в коді, насправді це тому , що визначення типу вже виконується , що компілятор може зробити висновок , який екземпляр класу використання. Це означає, що типval залежить від контексту, в якому він використовується. Ось чому також запуск однієї valоперації призводить доambiguous type error : компілятор не може зробити висновок будь-якого типу на основі контексту.

Для більш досконалих систем типу, таких як GADT, сім'ї типів, залежні типи, System (F) ω тощо, тип вже не є "типами", вони стають складними обчислювальними об'єктами. Наприклад, це означає, що два типи, які не виглядають однаково, необов'язково відрізняються. Отже рівність типу стає зовсім не тривіальною (взагалі).

Щоб навести приклад фактичної складності, розглянемо залежний тип списку: NList a nде aтип об’єктів у списку та nйого довжина.
Функція додавання мала б тип append :: NList a n -> NList a m -> NList a (n + m)і функція zip була б zip :: NList a n -> NList b n -> NList (a, b) n.
Уявіть, тепер у нас лямбда \a: NList t n, b: NList t m -> zip (append a b) (append b a). Тут перший аргумент zip має тип, NList t (n + m)а другий - тип NList t (m + n).
Майже те саме, але якщо перевіряючий тип не знає, що "+" комутується на натуральних числах, він повинен відхилити функцію, оскільки (n + m) не є буквально (m + n). Йдеться вже не про висновок типу / перевірку типу, це про доведення теореми.

Рідкі типи, здається, роблять деякі залежні умовиводи. Але, як я розумію, це насправді не залежний тип, а щось подібне до звичайних типів HM, для яких робиться додатковий висновок для обчислення статичних меж.

Я сподіваюся, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.