<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2</id>
	<title>Вывод типов - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2&amp;action=history"/>
	<updated>2026-07-17T00:34:35Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2&amp;diff=5363&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2&amp;diff=5363&amp;oldid=prev"/>
		<updated>2026-01-26T12:41:17Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Типизация данных}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Вывод типов&amp;#039;&amp;#039;&amp;#039; ({{lang-en|type inference}}) — в [[Программирование|программировании]] возможность [[компилятор]]а самому логически вывести [[Тип данных|тип значения]] у [[Выражение (информатика)|выражения]]. Впервые [[Машина вывода|механизм вывода]] типов был представлен в языке [[ML]], где компилятор всегда выводит наиболее общий [[Параметрический полиморфизм|полиморфный]] тип для всякого выражения. Это не только сокращает размер исходного кода и повышает его лаконичность, но и нередко повышает [[повторное использование кода]]&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
|заглавие = A Critique of Standard ML&lt;br /&gt;
|автор = Andrew W. Appel&lt;br /&gt;
|издательство = Princeton University, revised version of CS-TR-364-92&lt;br /&gt;
|год = 1992&lt;br /&gt;
|ссылка =&lt;br /&gt;
|ref = Appel - A Critique of Standard ML&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вывод типов характерен для [[Язык функционального программирования|функциональных языков программирования]], хотя со временем он был частично реализован и в [[Объектно-ориентированный язык программирования|объектно-ориентированных языках]] ([[C Sharp|C#]], [[D (язык программирования)|D]], [[Visual Basic .NET]], [[Nim]], [[C++11]], [[Vala]], [[Java]]{{efn|поддержка добавлена в [[Java#Java SE 10|Java SE 10]]}}), где ограничивается возможностью опустить тип идентификатора в определении с инициализацией (см. [[синтаксический сахар]]). Например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var s = &amp;quot;Hello, world!&amp;quot;;  // Тип переменной s (от string) выведен исходя из инициализатора&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы ==&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм Хиндли — Милнера ===&lt;br /&gt;
{{falseredirect|Система типов Хиндли — Милнера}}&lt;br /&gt;
Алгоритм Хи́ндли — Ми́лнера — механизм вывода типов выражений, реализуемый в языках программирования, основанных на [[Система типов Хиндли — Милнера|системе типов Хиндли — Милнера]], таких как [[ML]] (первый язык этого семейства), [[Standard ML]], [[OCaml]], [[Haskell]], [[F Sharp|F#]], [[Fortress]] и [[Boo]]. Язык [[Nemerle]] использует этот алгоритм с рядом необходимых изменений&amp;lt;ref&amp;gt;{{статья&lt;br /&gt;
|автор = Michał Moskal&lt;br /&gt;
|заглавие = Type Inference with Deferral&lt;br /&gt;
|publisher = Institute of Computer Science, University of Wrocław&lt;br /&gt;
|год = 2005&lt;br /&gt;
|ссылка = http://research.microsoft.com/en-us/um/people/moskal/pdf/msc.pdf&lt;br /&gt;
|archive-date = 2016-03-04&lt;br /&gt;
|archive-url = https://web.archive.org/web/20160304085538/http://research.microsoft.com/en-us/um/people/moskal/pdf/msc.pdf&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Механизм вывода типов основан на возможности автоматически полностью или частично выводить тип выражения, полученного при помощи вычисления некоторого выражения. Так как этот процесс систематически производится во время трансляции программы, транслятор часто может вывести тип переменной или функции без явного указания типов этих объектов. Во многих случаях можно опускать явные декларации типов — это можно делать для достаточно простых объектов, либо для языков с простым синтаксисом. Например, в языке [[Haskell]] реализован достаточно мощный механизм вывода типов, поэтому указание типов функций в этом языке программирования не требуется. Программист может указать тип функции явно для того, чтобы ограничить её использование только для конкретных типов данных, либо для более структурированного оформления исходного кода.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить информацию для корректного вывода типа выражения в условиях отсутствия явной декларации типа этого выражения, транслятор либо собирает такую информацию из явных деклараций типов подвыражений (переменных, функций), входящих в изучаемое выражение, либо использует неявную информацию о типах атомарных значений. Такой алгоритм не всегда помогает определить тип выражения, особенно в случаях использования [[Функция высшего порядка|функций высших порядков]] и [[Параметрический полиморфизм|параметрического полиморфизма]] достаточно сложной природы. Поэтому в сложных случаях, когда есть необходимость избежать неоднозначностей, рекомендуется явно указывать тип выражений.&lt;br /&gt;
&lt;br /&gt;
Сама модель типизации основана на алгоритме вывода типов выражений, который имеет своим источником механизм получения типов выражений, используемый в типизированном [[Лямбда-исчисление|λ-исчислении]], который был предложен в [[1958]] г. [[Карри, Хаскелл|Х. Карри]] и Р. Фейсом. Далее уже́ [[Хиндли, Рождер|Роджер Хиндли]] в [[1969]] г. расширил сам алгоритм и доказал, что он выводит наиболее общий тип выражения. В [[1978]] г. [[Милнер, Робин|Робин Милнер]] независимо от Р. Хиндли доказал свойства эквивалентного алгоритма. И, наконец, в [[1985]] г. [[Дамас, Луис|Луис Дамас]] окончательно показал, что алгоритм Милнера является законченным и может использоваться для полиморфных типов. В связи с этим алгоритм Хиндли — Милнера иногда называют также и &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;алгоритмом Дамаса — Милнера&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Система типов определяется в модели Хиндли — Милнера следующим образом:&lt;br /&gt;
&lt;br /&gt;
# Примитивные типы &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; являются типами выражений.&lt;br /&gt;
# Параметрические переменные типов α являются типами выражений.&lt;br /&gt;
# Если &amp;lt;math&amp;gt;\sigma_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma_{2}&amp;lt;/math&amp;gt; — типы выражений, то тип &amp;lt;math&amp;gt;\sigma_{1} \rightarrow \sigma_{2}&amp;lt;/math&amp;gt; является типом выражений.&lt;br /&gt;
# Символ &amp;lt;math&amp;gt;\bot&amp;lt;/math&amp;gt; является типом выражений.&lt;br /&gt;
&lt;br /&gt;
Выражения, типы которых вычисляются, определяются довольно стандартным образом:&lt;br /&gt;
&lt;br /&gt;
# Константы являются выражениями.&lt;br /&gt;
# Переменные являются выражениями.&lt;br /&gt;
# Если &amp;lt;math&amp;gt;e_{1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;e_{2}&amp;lt;/math&amp;gt; — выражения, то (&amp;lt;math&amp;gt;e_{1} e_{2}&amp;lt;/math&amp;gt;) — выражение.&lt;br /&gt;
# Если &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; — переменная, а &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; — выражение, то &amp;lt;math&amp;gt;\lambda v.e&amp;lt;/math&amp;gt; — выражение.&lt;br /&gt;
&lt;br /&gt;
Говорят, что тип &amp;lt;math&amp;gt;\sigma_{1}&amp;lt;/math&amp;gt; является экземпляром типа &amp;lt;math&amp;gt;\sigma_{2}&amp;lt;/math&amp;gt;, когда имеется некое преобразование &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; такое, что:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sigma_{1} = \rho(\sigma_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом обычно полагается, что на преобразования типов &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; накладываются ограничения, заключающиеся в том, что:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho(\sigma_{1} \rightarrow \sigma_{2}) = \rho(\sigma_{1}) \rightarrow \rho(\sigma_{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\rho(\tau) = \tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам алгоритм вывода типов состоит из двух шагов — генерация системы уравнений и последующее решение этих уравнений.&lt;br /&gt;
&lt;br /&gt;
==== Построение системы уравнений ====&lt;br /&gt;
Построение системы уравнений основано на следующих правилах:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma v = \tau&amp;lt;/math&amp;gt; — в том случае, если связывание &amp;lt;math&amp;gt;v : \tau&amp;lt;/math&amp;gt; находится в &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma (g e) = \tau&amp;lt;/math&amp;gt; — в том случае, если &amp;lt;math&amp;gt;\tau_{1} = \tau_{2} \rightarrow \tau&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\tau_{1} = \Gamma g&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\tau_{2} = \Gamma e&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;\Gamma (\lambda v.e) = \tau \rightarrow \tau_{e}&amp;lt;/math&amp;gt; — в том случае, если &amp;lt;math&amp;gt;\tau_{e} = \Gamma&amp;#039; e&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;\Gamma&amp;#039;&amp;lt;/math&amp;gt; это &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt; с добавленным связыванием &amp;lt;math&amp;gt;v : \tau&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В этих правилах под символом &amp;lt;math&amp;gt;\Gamma&amp;lt;/math&amp;gt; понимается набор связываний переменных с их типами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Gamma = v_{1} : A_{1}, v_{2} : A_{2}, \ldots, v_{n} : A_{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Решение системы уравнений ====&lt;br /&gt;
Решение построенной системы уравнений основано на [[алгоритм унификации|алгоритме унификации]]. Это достаточно простой алгоритм. Имеется некоторая функция &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, которая принимает на вход уравнение типов и возвращает подстановку, которая делает левую и правую части уравнения одинаковыми («унифицирует» их). Подстановка — это просто проекция переменных типов на сами типы. Такие подстановки могут вычисляться различными способами, которые зависят от конкретной реализации алгоритма Хиндли — Милнера.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Утиная типизация]]&lt;br /&gt;
* [[Приведение типа]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
{{комментарии}}&lt;br /&gt;
&lt;br /&gt;
=== Источники ===&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [https://web.archive.org/web/20050911123640/http://www.cs.berkeley.edu/~nikitab/courses/cs263/hm.html Реализация алгоритма Хиндли-Милнера] на [[Perl]]{{ref|en}}&lt;br /&gt;
* [http://www.cis.upenn.edu/~bcpierce/types/archives/1988/msg00042.html Archived e-mail message] by Roger Hindley, explains history of type inference&lt;br /&gt;
* [https://web.archive.org/web/20110410102617/http://www.brics.dk/~mis/typeinf.pdf Polymorphic Type Inference] by Michael Schwartzbach, gives an overview of Polymorphic type inference.&lt;br /&gt;
* [https://web.archive.org/web/20120324053855/http://ian-grant.net/hm/milner-damas.pdf Principal type-schemes for functional programs.] A re-typeset copy of the Damas and Milner paper which described the soundness and completeness proofs.&lt;br /&gt;
* [https://web.archive.org/web/20120324053910/http://www.ian-grant.net/hm/ 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.&lt;br /&gt;
* [http://lucacardelli.name/Papers/BasicTypechecking.pdf Basic Typechecking] paper by Luca Cardelli, describes algorithm, includes implementation in [[Modula-2]]&lt;br /&gt;
* [https://dysphoria.net/2009/06/28/hindley-milner-type-inference-in-scala/ Implementation] of Hindley-Milner type inference in [[Scala (язык программирования)|Scala]], by Andrew Forrest (retrieved July 30, 2009)&lt;br /&gt;
* {{Cite web |url=http://www.cs.berkeley.edu/~nikitab/courses/cs263/hm.html |title=Implementation of Hindley-Milner in Perl 5, by Nikita Borisov |access-date=2009-03-12 |archive-url=https://web.archive.org/web/20070218103011/http://www.cs.berkeley.edu/~nikitab/courses/cs263/hm.html |archive-date=2007-02-18 |url-status=dead }}&lt;br /&gt;
* [https://web.archive.org/web/20150810222004/http://www.codecommit.com/blog/scala/what-is-hindley-milner-and-why-is-it-cool What is Hindley-Milner? (and why is it cool?)] Explains Hindley-Milner, examples in Scala&lt;br /&gt;
* http://fprog.ru/2010/issue5/roman-dushkin-hindley-milner/ Модель типизации Хиндли-Милнера и пример её реализации на языке Haskell&lt;br /&gt;
&lt;br /&gt;
{{нет сносок|дата=2013-11-26}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Типы данных]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>