Википедия

Выведение типа

Вывод типов (англ. type inference) — в программировании возможность компилятора самому логически вывести тип значения у выражения. Впервые механизм вывода типов был представлен в языке ML, где компилятор всегда выводит наиболее общий полиморфный тип для всякого выражения. Это не только сокращает размер исходного кода и повышает его лаконичность, но и нередко повышает повторное использование кода.

Вывод типов характерен для функциональных языков программирования, хотя со временем он был частично реализован и в объектно-ориентированных языках (C#, D, Visual Basic .NET, Nim, C++11, Vala, Java), где ограничивается возможностью опустить тип идентификатора в определении с инициализацией (см. синтаксический сахар). Например:

var s = "Hello, world!"; // Тип переменной s (от string) выведен исходя из инициализатора 

Алгоритмы

Алгоритм Хиндли — Милнера

Алгоритм Хи́ндли — Ми́лнера — механизм вывода типов выражений, реализуемый в языках программирования, основанных на системе типов Хиндли — Милнера, таких как ML (первый язык этого семейства), Standard ML, OCaml, Haskell, F#, Fortress и Boo. Язык Nemerle использует этот алгоритм с рядом необходимых изменений.

Механизм вывода типов основан на возможности автоматически полностью или частично выводить тип выражения, полученного при помощи вычисления некоторого выражения. Так как этот процесс систематически производится во время трансляции программы, транслятор часто может вывести тип переменной или функции без явного указания типов этих объектов. Во многих случаях можно опускать явные декларации типов — это можно делать для достаточно простых объектов, либо для языков с простым синтаксисом. Например, в языке Haskell реализован достаточно мощный механизм вывода типов, поэтому указание типов функций в этом языке программирования не требуется. Программист может указать тип функции явно для того, чтобы ограничить её использование только для конкретных типов данных, либо для более структурированного оформления исходного кода.

Для того, чтобы получить информацию для корректного вывода типа выражения в условиях отсутствия явной декларации типа этого выражения, транслятор либо собирает такую информацию из явных деклараций типов подвыражений (переменных, функций), входящих в изучаемое выражение, либо использует неявную информацию о типах атомарных значений. Такой алгоритм не всегда помогает определить тип выражения, особенно в случаях использования функций высших порядков и параметрического полиморфизма достаточно сложной природы. Поэтому в сложных случаях, когда есть необходимость избежать неоднозначностей, рекомендуется явно указывать тип выражений.

Сама модель типизации основана на алгоритме вывода типов выражений, который имеет своим источником механизм получения типов выражений, используемый в типизированном λ-исчислении, который был предложен в 1958 г. Х. Карри и Р. Фейсом. Далее уже́ в 1969 г. расширил сам алгоритм и доказал, что он выводит наиболее общий тип выражения. В 1978 г. Робин Милнер независимо от Р. Хиндли доказал свойства эквивалентного алгоритма. И, наконец, в 1985 г. окончательно показал, что алгоритм Милнера является законченным и может использоваться для полиморфных типов. В связи с этим алгоритм Хиндли — Милнера иногда называют также и алгоритмом Дамаса — Милнера.

Система типов определяется в модели Хиндли — Милнера следующим образом:

  1. Примитивные типы image являются типами выражений.
  2. Параметрические переменные типов α являются типами выражений.
  3. Если image и image — типы выражений, то тип image является типом выражений.
  4. Символ image является типом выражений.

Выражения, типы которых вычисляются, определяются довольно стандартным образом:

  1. Константы являются выражениями.
  2. Переменные являются выражениями.
  3. Если image и image — выражения, то (image) — выражение.
  4. Если image — переменная, а image — выражение, то image — выражение.

Говорят, что тип image является экземпляром типа image, когда имеется некое преобразование image такое, что:

image

При этом обычно полагается, что на преобразования типов image накладываются ограничения, заключающиеся в том, что:

  1. image
  2. image

Сам алгоритм вывода типов состоит из двух шагов — генерация системы уравнений и последующее решение этих уравнений.

Построение системы уравнений

Построение системы уравнений основано на следующих правилах:

  1. image — в том случае, если связывание image находится в image.
  2. image — в том случае, если image, где image и image.
  3. image — в том случае, если image, где image это image с добавленным связыванием image.

В этих правилах под символом image понимается набор связываний переменных с их типами:

image

Решение системы уравнений

Решение построенной системы уравнений основано на . Это достаточно простой алгоритм. Имеется некоторая функция image, которая принимает на вход уравнение типов и возвращает подстановку, которая делает левую и правую части уравнения одинаковыми («унифицирует» их). Подстановка — это просто проекция переменных типов на сами типы. Такие подстановки могут вычисляться различными способами, которые зависят от конкретной реализации алгоритма Хиндли — Милнера.

См. также

Примечания

Комментарии

  1. поддержка добавлена в Java SE 10

Источники

  1. Andrew W. Appel. A Critique of Standard ML. — Princeton University, revised version of CS-TR-364-92, 1992.
  2. Michał Moskal. Type Inference with Deferral. — 2005. Архивировано 4 марта 2016 года.


Ссылки

  • Реализация алгоритма Хиндли-Милнера на Perl (англ.)
  • Archived e-mail message by Roger Hindley, explains history of type inference
  • Polymorphic Type Inference 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.
  • Tutorial and complete implementation in Standard ML 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 paper by Luca Cardelli, describes algorithm, includes implementation in Modula-2
  • Implementation of Hindley-Milner type inference in Scala, by Andrew Forrest (retrieved July 30, 2009)
  • Implementation of Hindley-Milner in Perl 5, by Nikita Borisov. Дата обращения: 12 марта 2009. Архивировано из оригинала 18 февраля 2007 года.
  • What is Hindley-Milner? (and why is it cool?) Explains Hindley-Milner, examples in Scala
  • http://fprog.ru/2010/issue5/roman-dushkin-hindley-milner/ Модель типизации Хиндли-Милнера и пример её реализации на языке Haskell

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Выведение типа, Что такое Выведение типа? Что означает Выведение типа?

Vyvod tipov angl type inference v programmirovanii vozmozhnost kompilyatora samomu logicheski vyvesti tip znacheniya u vyrazheniya Vpervye mehanizm vyvoda tipov byl predstavlen v yazyke ML gde kompilyator vsegda vyvodit naibolee obshij polimorfnyj tip dlya vsyakogo vyrazheniya Eto ne tolko sokrashaet razmer ishodnogo koda i povyshaet ego lakonichnost no i neredko povyshaet povtornoe ispolzovanie koda Vyvod tipov harakteren dlya funkcionalnyh yazykov programmirovaniya hotya so vremenem on byl chastichno realizovan i v obektno orientirovannyh yazykah C D Visual Basic NET Nim C 11 Vala Java gde ogranichivaetsya vozmozhnostyu opustit tip identifikatora v opredelenii s inicializaciej sm sintaksicheskij sahar Naprimer var s Hello world Tip peremennoj s ot string vyveden ishodya iz inicializatoraAlgoritmyAlgoritm Hindli Milnera Zapros Sistema tipov Hindli Milnera d perenapravlyaetsya syuda Na etu temu nuzhno sozdat otdelnuyu statyu Algoritm Hi ndli Mi lnera mehanizm vyvoda tipov vyrazhenij realizuemyj v yazykah programmirovaniya osnovannyh na sisteme tipov Hindli Milnera takih kak ML pervyj yazyk etogo semejstva Standard ML OCaml Haskell F Fortress i Boo Yazyk Nemerle ispolzuet etot algoritm s ryadom neobhodimyh izmenenij Mehanizm vyvoda tipov osnovan na vozmozhnosti avtomaticheski polnostyu ili chastichno vyvodit tip vyrazheniya poluchennogo pri pomoshi vychisleniya nekotorogo vyrazheniya Tak kak etot process sistematicheski proizvoditsya vo vremya translyacii programmy translyator chasto mozhet vyvesti tip peremennoj ili funkcii bez yavnogo ukazaniya tipov etih obektov Vo mnogih sluchayah mozhno opuskat yavnye deklaracii tipov eto mozhno delat dlya dostatochno prostyh obektov libo dlya yazykov s prostym sintaksisom Naprimer v yazyke Haskell realizovan dostatochno moshnyj mehanizm vyvoda tipov poetomu ukazanie tipov funkcij v etom yazyke programmirovaniya ne trebuetsya Programmist mozhet ukazat tip funkcii yavno dlya togo chtoby ogranichit eyo ispolzovanie tolko dlya konkretnyh tipov dannyh libo dlya bolee strukturirovannogo oformleniya ishodnogo koda Dlya togo chtoby poluchit informaciyu dlya korrektnogo vyvoda tipa vyrazheniya v usloviyah otsutstviya yavnoj deklaracii tipa etogo vyrazheniya translyator libo sobiraet takuyu informaciyu iz yavnyh deklaracij tipov podvyrazhenij peremennyh funkcij vhodyashih v izuchaemoe vyrazhenie libo ispolzuet neyavnuyu informaciyu o tipah atomarnyh znachenij Takoj algoritm ne vsegda pomogaet opredelit tip vyrazheniya osobenno v sluchayah ispolzovaniya funkcij vysshih poryadkov i parametricheskogo polimorfizma dostatochno slozhnoj prirody Poetomu v slozhnyh sluchayah kogda est neobhodimost izbezhat neodnoznachnostej rekomenduetsya yavno ukazyvat tip vyrazhenij Sama model tipizacii osnovana na algoritme vyvoda tipov vyrazhenij kotoryj imeet svoim istochnikom mehanizm polucheniya tipov vyrazhenij ispolzuemyj v tipizirovannom l ischislenii kotoryj byl predlozhen v 1958 g H Karri i R Fejsom Dalee uzhe v 1969 g rasshiril sam algoritm i dokazal chto on vyvodit naibolee obshij tip vyrazheniya V 1978 g Robin Milner nezavisimo ot R Hindli dokazal svojstva ekvivalentnogo algoritma I nakonec v 1985 g okonchatelno pokazal chto algoritm Milnera yavlyaetsya zakonchennym i mozhet ispolzovatsya dlya polimorfnyh tipov V svyazi s etim algoritm Hindli Milnera inogda nazyvayut takzhe i algoritmom Damasa Milnera Sistema tipov opredelyaetsya v modeli Hindli Milnera sleduyushim obrazom Primitivnye tipy t displaystyle tau yavlyayutsya tipami vyrazhenij Parametricheskie peremennye tipov a yavlyayutsya tipami vyrazhenij Esli s1 displaystyle sigma 1 i s2 displaystyle sigma 2 tipy vyrazhenij to tip s1 s2 displaystyle sigma 1 rightarrow sigma 2 yavlyaetsya tipom vyrazhenij Simvol displaystyle bot yavlyaetsya tipom vyrazhenij Vyrazheniya tipy kotoryh vychislyayutsya opredelyayutsya dovolno standartnym obrazom Konstanty yavlyayutsya vyrazheniyami Peremennye yavlyayutsya vyrazheniyami Esli e1 displaystyle e 1 i e2 displaystyle e 2 vyrazheniya to e1e2 displaystyle e 1 e 2 vyrazhenie Esli v displaystyle v peremennaya a e displaystyle e vyrazhenie to lv e displaystyle lambda v e vyrazhenie Govoryat chto tip s1 displaystyle sigma 1 yavlyaetsya ekzemplyarom tipa s2 displaystyle sigma 2 kogda imeetsya nekoe preobrazovanie r displaystyle rho takoe chto s1 r s2 displaystyle sigma 1 rho sigma 2 Pri etom obychno polagaetsya chto na preobrazovaniya tipov r displaystyle rho nakladyvayutsya ogranicheniya zaklyuchayushiesya v tom chto r s1 s2 r s1 r s2 displaystyle rho sigma 1 rightarrow sigma 2 rho sigma 1 rightarrow rho sigma 2 r t t displaystyle rho tau tau Sam algoritm vyvoda tipov sostoit iz dvuh shagov generaciya sistemy uravnenij i posleduyushee reshenie etih uravnenij Postroenie sistemy uravnenij Postroenie sistemy uravnenij osnovano na sleduyushih pravilah Gv t displaystyle Gamma v tau v tom sluchae esli svyazyvanie v t displaystyle v tau nahoditsya v G displaystyle Gamma G ge t displaystyle Gamma ge tau v tom sluchae esli t1 t2 t displaystyle tau 1 tau 2 rightarrow tau gde t1 Gg displaystyle tau 1 Gamma g i t2 Ge displaystyle tau 2 Gamma e G lv e t te displaystyle Gamma lambda v e tau rightarrow tau e v tom sluchae esli te G e displaystyle tau e Gamma e gde G displaystyle Gamma eto G displaystyle Gamma s dobavlennym svyazyvaniem v t displaystyle v tau V etih pravilah pod simvolom G displaystyle Gamma ponimaetsya nabor svyazyvanij peremennyh s ih tipami G v1 A1 v2 A2 vn An displaystyle Gamma v 1 A 1 v 2 A 2 ldots v n A n Reshenie sistemy uravnenij Reshenie postroennoj sistemy uravnenij osnovano na Eto dostatochno prostoj algoritm Imeetsya nekotoraya funkciya u displaystyle u kotoraya prinimaet na vhod uravnenie tipov i vozvrashaet podstanovku kotoraya delaet levuyu i pravuyu chasti uravneniya odinakovymi unificiruet ih Podstanovka eto prosto proekciya peremennyh tipov na sami tipy Takie podstanovki mogut vychislyatsya razlichnymi sposobami kotorye zavisyat ot konkretnoj realizacii algoritma Hindli Milnera Sm takzheUtinaya tipizaciya Privedenie tipaPrimechaniyaKommentarii podderzhka dobavlena v Java SE 10 Istochniki Andrew W Appel A Critique of Standard ML Princeton University revised version of CS TR 364 92 1992 Michal Moskal Type Inference with Deferral 2005 Arhivirovano 4 marta 2016 goda SsylkiRealizaciya algoritma Hindli Milnera na Perl angl Archived e mail message by Roger Hindley explains history of type inference Polymorphic Type Inference 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 Tutorial and complete implementation in Standard ML 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 paper by Luca Cardelli describes algorithm includes implementation in Modula 2 Implementation of Hindley Milner type inference in Scala by Andrew Forrest retrieved July 30 2009 Implementation of Hindley Milner in Perl 5 by Nikita Borisov neopr Data obrasheniya 12 marta 2009 Arhivirovano iz originala 18 fevralya 2007 goda What is Hindley Milner and why is it cool Explains Hindley Milner examples in Scala http fprog ru 2010 issue5 roman dushkin hindley milner Model tipizacii Hindli Milnera i primer eyo realizacii na yazyke HaskellV state est spisok istochnikov no ne hvataet snosok Bez snosok slozhno opredelit iz kakogo istochnika vzyato kazhdoe otdelnoe utverzhdenie Vy mozhete uluchshit statyu prostaviv snoski na istochniki podtverzhdayushie informaciyu Svedeniya bez snosok mogut byt udaleny 26 noyabrya 2013

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто