Ви́від ти́пів (англ. type inference) — в програмуванні можливість компілятора самому логічно вивести тип значення у виразу. Вперше механізм виведення типів був представлений в мові ML, де компілятор завжди виводить найзагальніший поліморфний тип для будь-якого виразу. Це не тільки скорочує розмір початкового коду і підвищує його лаконічність, але і часто підвищує повторне використання коду.
Вивід типів є характерним для функціональних мов програмування, хоча з часом ця можливість частково з'явилася і в об'єктно-орієнтованих мовах програмування (C#, D, Visual Basic .NET, , Vala, Go), де вона обмежується можливістю опустити тип ідентифікатора у визначенні з ініціалізацією (див. синтаксичний цукор). Наприклад:
var s = "Hello, world!"; // Тип змінної s (string) виведений з ініціалізатора
Алгоритми
Алгоритм Гіндлі – Мілнера
Алгоритм Гіндлі – Мілнера — механізм виводу типів виразів, який реалізується в мовах програмування, які базуються на [en], таких як ML (перша мова цього сімейства), Standard ML, OCaml, Haskell, F#, та Boo. Мова Nemerle використовує цей алгоритм з рядом необхідних змін.
Механізм виведення типів базується на можливості автоматично повністю або частково виводити тип виразу, отриманого за допомогою обчислення деякого виразу. Оскільки цей процес систематично проводиться під час трансляції програми, транслятор часто може вивести тип змінної або функції без явного вказування типів цих об'єктів. В багатьох випадках можна опускати явні декларації типів — це можна робити для достатньо простих об'єктів, або для мов з простим синтаксисом. Наприклад, в мові Haskell реалізований достатньо потужний механізм виведення типів, тому явного вказування типів функцій в цій мові програмування не потрібно. Програміст може вказати тип функції явно для того, щоб обмежити її використання тільки для конкретних типів даних, або для більш структурованого оформлення початкового коду.
Для того, щоб отримати інформацію для коректного виведення типу виразу в умовах відсутності явної декларації типу цього виразу, транслятор або збирає таку інформацію з явних декларацій типів підвиразів (змінних, функцій), які входять до виразу, що вивчається, або використовує неявну інформацію про типи атомарних значень. Такий алгоритм не завжди допомагає визначити тип виразу, особливо у випадку використання функцій вищих порядків і достатньо складної природи. Тому в складних випадках, коли виникає необхідність уникнути неоднозначностей, рекомендується явно вказувати тип виразів.
Сама модель типізації базується на алгоритмі виведення типів виразів, який має як джерело механізм отримання типів виразів, що використовується в типізованому λ-численні, який був запропонований в 1958 році Г. Каррі і Р. Фейсом. Далі вже [en] в 1969 році розширив сам алгоритм і довів, що він виводить найзагальніший тип виразу. В 1978 році Робін Мілнер незалежно від Р. Гіндлі довів властивості еквівалентного алгоритму. І, нарешті, в 1985 році остаточно показав, що алгоритм Мілнера є завершеним і може використовуватись для поліморфних типів. У зв'язку з цим алгоритм Гіндлі – Мілнера інколи називають також і алгоритмом Дамаса – Мілнера.
Система типів визначається в моделі Гіндлі – Мілнера наступним чином:
- Примітивні типи є типами виразів.
- Параметричні змінні типів α є типами виразів.
- Якщо і — типи виразів, то тип є типом виразів.
- Символ є типом виразів.
Вирази, типи яких обчислюються, визначаються досить стандартним чином:
- Константи є виразами.
- Змінні є виразами.
- Якщо і — вирази, то () — вираз.
- Якщо — змінна, а — вираз, то — вираз.
Кажуть, що тип є екземпляром типу , коли існує деяке перетворення таке, що:
При цьому зазвичай вважається, що на перетворення типів накладаються обмеження, які полягають в тому, що:
Сам алгоритм виведення типів складається з двох кроків — генерування системи рівнянь і наступне розв'язування цих рівнянь.
Побудова системи рівнянь
Побудова системи рівнянь базується на наступних правилах:
- — в тому випадку, якщо зв'язування знаходиться в .
- — в тому випадку, якщо , де і .
- — в тому випадку, якщо і є розширенням зв'язуванням .
В цих правилах під символом розуміється набір зв'язувань змінних з їх типами (середовище типізації):
Розв'язування системи рівнянь
Розв'язування побудованої системи рівнянь базується на . Це достатньо простий алгоритм. Є деяка функція , яка приймає на вхід рівняння типів і повертає деяку підстановку. Підстановка — це просто проєкція змінних типів на самі типи. Такі підстановки можуть обчислюватись різними способами, які залежать від конкретної реалізації алгоритму Гіндлі – Мілнера.
Див. також
Примітки
- Andrew W. Appel. A Critique of Standard ML // Princeton University, revised version of CS-TR-364-92. — 1992.(англ.)
- Michał Moskal. Type Inference with Deferral // Institute of Computer Science, University of Wrocław. — 2005. з джерела 4 березня 2016. Процитовано 29 липня 2015.(англ.)
Посилання
- на Perl (англ.)
- Archived e-mail message [ 6 лютого 2021 у Wayback Machine.] by Roger Hindley, explains history of type inference (англ.)
- Polymorphic Type Inference [ 10 квітня 2011 у Wayback Machine.] by Michael Schwartzbach, gives an overview of Polymorphic type inference. (англ.)
- Principal type-schemes for functional programs. A re-typeset copy of the Damas and Milner paper which described the soundness and completeness proofs. (англ.)
- The tutorial includes some of the logical history of type systems as well as a detailed description of the algorithm as implemented. Some typographic errors in the original Damas Milner paper are corrected. (англ.)
- Basic Typechecking [ 11 серпня 2015 у Wayback Machine.] paper by Luca Cardelli, describes algorithm, includes implementation in (англ.)
- Implementation [ 15 лютого 2015 у Wayback Machine.] of Hindley-Milner type inference in Scala, by Andrew Forrest (retrieved July 30, 2009) (англ.)
- Implementation of Hindley-Milner in Perl 5, by Nikita Borisov на сайті Wayback Machine (архівовано лютий 18, 2007). (англ.)
- What is Hindley-Milner? (and why is it cool?) [ 10 серпня 2015 у Wayback Machine.] Explains Hindley-Milner, examples in Scala (англ.)
- http://fprog.ru/2010/issue5/roman-dushkin-hindley-milner/ [ 30 грудня 2014 у Wayback Machine.] Модель типізації Гіндлі-Мілнера і приклад її реалізації на мові Haskell (рос.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Vi vid ti piv angl type inference v programuvanni mozhlivist kompilyatora samomu logichno vivesti tip znachennya u virazu Vpershe mehanizm vivedennya tipiv buv predstavlenij v movi ML de kompilyator zavzhdi vivodit najzagalnishij polimorfnij tip dlya bud yakogo virazu Ce ne tilki skorochuye rozmir pochatkovogo kodu i pidvishuye jogo lakonichnist ale i chasto pidvishuye povtorne vikoristannya kodu Vivid tipiv ye harakternim dlya funkcionalnih mov programuvannya hocha z chasom cya mozhlivist chastkovo z yavilasya i v ob yektno oriyentovanih movah programuvannya C D Visual Basic NET C 11 Vala Go de vona obmezhuyetsya mozhlivistyu opustiti tip identifikatora u viznachenni z inicializaciyeyu div sintaksichnij cukor Napriklad var s Hello world Tip zminnoyi s string vivedenij z inicializatoraAlgoritmiAlgoritm Gindli Milnera Algoritm Gindli Milnera mehanizm vivodu tipiv viraziv yakij realizuyetsya v movah programuvannya yaki bazuyutsya na en takih yak ML persha mova cogo simejstva Standard ML OCaml Haskell F ta Boo Mova Nemerle vikoristovuye cej algoritm z ryadom neobhidnih zmin Mehanizm vivedennya tipiv bazuyetsya na mozhlivosti avtomatichno povnistyu abo chastkovo vivoditi tip virazu otrimanogo za dopomogoyu obchislennya deyakogo virazu Oskilki cej proces sistematichno provoditsya pid chas translyaciyi programi translyator chasto mozhe vivesti tip zminnoyi abo funkciyi bez yavnogo vkazuvannya tipiv cih ob yektiv V bagatoh vipadkah mozhna opuskati yavni deklaraciyi tipiv ce mozhna robiti dlya dostatno prostih ob yektiv abo dlya mov z prostim sintaksisom Napriklad v movi Haskell realizovanij dostatno potuzhnij mehanizm vivedennya tipiv tomu yavnogo vkazuvannya tipiv funkcij v cij movi programuvannya ne potribno Programist mozhe vkazati tip funkciyi yavno dlya togo shob obmezhiti yiyi vikoristannya tilki dlya konkretnih tipiv danih abo dlya bilsh strukturovanogo oformlennya pochatkovogo kodu Dlya togo shob otrimati informaciyu dlya korektnogo vivedennya tipu virazu v umovah vidsutnosti yavnoyi deklaraciyi tipu cogo virazu translyator abo zbiraye taku informaciyu z yavnih deklaracij tipiv pidviraziv zminnih funkcij yaki vhodyat do virazu sho vivchayetsya abo vikoristovuye neyavnu informaciyu pro tipi atomarnih znachen Takij algoritm ne zavzhdi dopomagaye viznachiti tip virazu osoblivo u vipadku vikoristannya funkcij vishih poryadkiv i dostatno skladnoyi prirodi Tomu v skladnih vipadkah koli vinikaye neobhidnist uniknuti neodnoznachnostej rekomenduyetsya yavno vkazuvati tip viraziv Sama model tipizaciyi bazuyetsya na algoritmi vivedennya tipiv viraziv yakij maye yak dzherelo mehanizm otrimannya tipiv viraziv sho vikoristovuyetsya v tipizovanomu l chislenni yakij buv zaproponovanij v 1958 roci G Karri i R Fejsom Dali vzhe en v 1969 roci rozshiriv sam algoritm i doviv sho vin vivodit najzagalnishij tip virazu V 1978 roci Robin Milner nezalezhno vid R Gindli doviv vlastivosti ekvivalentnogo algoritmu I nareshti v 1985 roci ostatochno pokazav sho algoritm Milnera ye zavershenim i mozhe vikoristovuvatis dlya polimorfnih tipiv U zv yazku z cim algoritm Gindli Milnera inkoli nazivayut takozh i algoritmom Damasa Milnera Sistema tipiv viznachayetsya v modeli Gindli Milnera nastupnim chinom Primitivni tipi v displaystyle v ye tipami viraziv Parametrichni zminni tipiv a ye tipami viraziv Yaksho s 1 displaystyle sigma 1 i s 2 displaystyle sigma 2 tipi viraziv to tip s 1 s 2 displaystyle sigma 1 rightarrow sigma 2 ye tipom viraziv Simvol displaystyle bot ye tipom viraziv Virazi tipi yakih obchislyuyutsya viznachayutsya dosit standartnim chinom Konstanti ye virazami Zminni ye virazami Yaksho e 1 displaystyle e 1 i e 2 displaystyle e 2 virazi to e 1 e 2 displaystyle e 1 e 2 viraz Yaksho v displaystyle v zminna a e displaystyle e viraz to l v e displaystyle lambda v e viraz Kazhut sho tip s 1 displaystyle sigma 1 ye ekzemplyarom tipu s 2 displaystyle sigma 2 koli isnuye deyake peretvorennya r displaystyle rho take sho s 1 r s 2 displaystyle sigma 1 rho sigma 2 Pri comu zazvichaj vvazhayetsya sho na peretvorennya tipiv r displaystyle rho nakladayutsya obmezhennya yaki polyagayut v tomu sho r s 1 s 2 r s 1 r s 2 displaystyle rho sigma 1 rightarrow sigma 2 rho sigma 1 rightarrow rho sigma 2 r v v displaystyle rho v v Sam algoritm vivedennya tipiv skladayetsya z dvoh krokiv generuvannya sistemi rivnyan i nastupne rozv yazuvannya cih rivnyan Pobudova sistemi rivnyan Pobudova sistemi rivnyan bazuyetsya na nastupnih pravilah f G v t displaystyle f Gamma v tau v tomu vipadku yaksho zv yazuvannya v t displaystyle v tau znahoditsya v G displaystyle Gamma f G e f t displaystyle f Gamma ef tau v tomu vipadku yaksho t 1 t 2 t displaystyle tau 1 tau 2 rightarrow tau de t 1 f G e displaystyle tau 1 f Gamma e i t 2 f G f displaystyle tau 2 f Gamma f f G l v e t t e displaystyle f Gamma lambda v e tau rightarrow tau e v tomu vipadku yaksho t e f G e displaystyle tau e f Gamma e i G displaystyle Gamma ye rozshirennyam G displaystyle Gamma zv yazuvannyam v t displaystyle v tau V cih pravilah pid simvolom G displaystyle Gamma rozumiyetsya nabir zv yazuvan zminnih z yih tipami seredovishe tipizaciyi G v 1 A 1 v 2 A 2 v n A n displaystyle Gamma v 1 A 1 v 2 A 2 ldots v n A n Rozv yazuvannya sistemi rivnyan Rozv yazuvannya pobudovanoyi sistemi rivnyan bazuyetsya na Ce dostatno prostij algoritm Ye deyaka funkciya u displaystyle u yaka prijmaye na vhid rivnyannya tipiv i povertaye deyaku pidstanovku Pidstanovka ce prosto proyekciya zminnih tipiv na sami tipi Taki pidstanovki mozhut obchislyuvatis riznimi sposobami yaki zalezhat vid konkretnoyi realizaciyi algoritmu Gindli Milnera Div takozhKachina tipizaciya Privedennya tipivPrimitkiAndrew W Appel A Critique of Standard ML Princeton University revised version of CS TR 364 92 1992 angl Michal Moskal Type Inference with Deferral Institute of Computer Science University of Wroclaw 2005 z dzherela 4 bereznya 2016 Procitovano 29 lipnya 2015 angl Posilannyana Perl angl Archived e mail message 6 lyutogo 2021 u Wayback Machine by Roger Hindley explains history of type inference angl Polymorphic Type Inference 10 kvitnya 2011 u Wayback Machine by Michael Schwartzbach gives an overview of Polymorphic type inference angl Principal type schemes for functional programs A re typeset copy of the Damas and Milner paper which described the soundness and completeness proofs angl The tutorial includes some of the logical history of type systems as well as a detailed description of the algorithm as implemented Some typographic errors in the original Damas Milner paper are corrected angl Basic Typechecking 11 serpnya 2015 u Wayback Machine paper by Luca Cardelli describes algorithm includes implementation in angl Implementation 15 lyutogo 2015 u Wayback Machine of Hindley Milner type inference in Scala by Andrew Forrest retrieved July 30 2009 angl Implementation of Hindley Milner in Perl 5 by Nikita Borisov na sajti Wayback Machine arhivovano lyutij 18 2007 angl What is Hindley Milner and why is it cool 10 serpnya 2015 u Wayback Machine Explains Hindley Milner examples in Scala angl http fprog ru 2010 issue5 roman dushkin hindley milner 30 grudnya 2014 u Wayback Machine Model tipizaciyi Gindli Milnera i priklad yiyi realizaciyi na movi Haskell ros