Дослідження щодо виводу типу на основі виклику?


9

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

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


Те, що ви описуєте, має підказки щодо двонаправленого виводу типу, якщо я не помиляюся. Опис того, що ви намагаєтесь зробити, можливо, уточнить.
Домінік Малліган

Ви питаєте, тому що ви шукаєте спосіб спеціалізуватися на поліморфних функціях?
nponeccop

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

Відповіді:


11

Практично всі системи з висновком типу використовують для цього інформацію про сайт для викликів. Приклади включають стандартні ML, OCaml, F # і Haskell. Багато інших мов використовують інформацію про сайт виклику для висновку про параметри типу параметрів, такі як Java, C #, Scala та набрана ракетка. Це часто походить під назвою "Локальний тип висновку".

Я б просто описав те, що ви шукаєте, як "Тип висновку", і ви, мабуть, слід почати з пошуку того, що зазвичай відомо як система "Хіндлі-Мілнер". Вікіпедія сторінка дає розумне введення і покажчики на оригінальні роботи.

Місце для початку локального типу - оригінальний папір Пірса та Тернера, найкраще прочитаний у версії TOPLAS 2000 ( ACM , PDF ).


Папір Пірса і Тернера була дуже освічувальною, дякую. Чи знаєте ви про мінімальну реалізацію алгоритму, який вони описують у коді? Я думаю, що це було б дуже цікаво подивитися, якщо він існує.
Дерек Thurn

Я не знаю жодних мінімальних реалізацій. Один є в набраному ракетці та один у Scala, але обидва реалізують значно складніші алгоритми.
Сем Тобін-Хохштадт

0

Ви можете подивитися на типові системи для типів перетину, які можуть дати вам щось подібне a :: Int -> Int | Bool -> Bool, так що ви знаєте, що двох спеціалізацій достатньо Intі Boolдостатньо, або використовувати звичайний висновок типу, щоб зробити висновок про найбільш загальні типи з подальшим аналізом потоку управління, щоб зібрати фактичний введіть аргументи. Насправді існують гібридні підходи (CFA виражається як типова система і навпаки).

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

Що стосується методів реалізації поліморфізму, існує два рішення: 1) спеціалізація (продумуйте шаблони C ++) 2) припущення про рівномірне представлення (подумайте про колекції стилю С з пустотою *).

Для 2 вам не потрібен тип із сайту виклику під час перевірки типу, і він може легше підтримувати окрему компіляцію.

Зауважимо, що ми говоримо тут про параметричний поліморфізм, а виклики віртуального методу OO - це зовсім інша річ, яка називається поліморфізмом підтипу. Зауважте, що шаблони C ++ підтримують як щось параметричне поліморфізм, так і типи качок, що є ще однією формою поліморфізму.


1
"Виклики віртуальних методів OO - це зовсім інша річ, яка називається спеціальним поліморфізмом" Спеціальний поліморфізм - це ще одна назва перевантаження. Ви ніби плутаєте це з підтипом поліморфізму.
Radu GRIGо

Але підкласи не обов'язково є підтипами, чи не так? Напр., Для підтипів LSP передбачається.
nponeccop

1
Правда, але поруч із суть. «Підтиповий поліморфізм» - це стандартний термін. Докладніше див. En.wikipedia.org/wiki/Subtype_polymorphism .
Radu GRIGо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.