ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » вывод типов » алгоритм Хиндли — Милнера (Hindley–Milner type inference algorithm)


алгоритм Хиндли — Милнера (Hindley–Milner type inference algorithm)

Сообщений 1 страница 3 из 3

1

[html]2010, Роман Душкин, Модель типизации Хиндли — Милнера и пример её реализации на языке Haskell
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.fprog.ru/2010/issue5/roman-dushkin-hindley-milner/">http://www.fprog.ru/2010/issue5/roman-dushkin-hindley-milner/</a>[/html]

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

Всё это делается для того, чтобы программисту было меньше писа́ть текста, записывать программу в сокращённом синтаксисе, а не в полном.

---

Однако типы используются для других разных целей, например для укладки значений в стек при вызове подпрограммы,
для определения времени жизни значений в куче в Rust.
Поэтому про систему типов нужно говорить и отдельно от алгоритма Хиндли-Милнера и лямбда-исчислений,
точнее, в идеале было бы хорошо иметь
математическую модель реальных процессоров (построить связь между лямбда-исчислением и моделью вычислений, приближенной к процессору).
Кое-что в природе существует, но связи с лямбда-исчислением я пока не видел
(или видел, но не понял. Functional Specification, это ведь не обязательно относится к "функциональному программированию"?).

---

1920-е
  алгоритм унификации и типизации были предложены
  К. Мередитом (в 1950-х годах)
  Дж. Моррисом (1968 год)
  предположительно, А. Тарским (вообще в 1920-х годах).

1965, Дж. А. Робинзон,
   предложил "принцип резолюции"
1969 год, Роджер Хиндли
  доказал, что его алгоритм выводит наиболее общий тип выражения
1978 год, Робин Милнер
1982 год, Луис Дамас
   доказал, что алгоритм Милнера полон и позволяет выводить типы в полиморфных системах

Базовый вариант оперирует только теми сущностями, которые используются в простом типизированном λ-исчислении —  в результате работы алгоритма для λ-термов получаются только базовые типы из известного множества (хотя непосредственно в процессе вывода используются типовые переменные).

Алгоритм автоматического вывода типов строит систему уравнений, неизвестными в которой являются типы, после чего решает эту систему, находя неизвестные значения.

Для решения построенной системы уравнений применяется процедура унификации. Её суть заключается в сравнении типов и попытках сопоставить типы друг с другом.

унификация - процедура приведения к наиболее общему типу.

Наиболее общим типом называется такой тип заданного выражения, к которому можно привести любой другой тип, который может быть приписан этому выражению.

Тип может быть представлен в виде дерева,
в узлах которого находятся конструкторы типов, а в листьевых вершинах — базовые типы.

У нас это преобразования из целого в плавающее.

Правила вывода представляют собой продукции, записанные в форме дробей. «Числитель» дроби представляет собой посылку правила (антецедент), «знаменатель», соответственно, — заключение правила (консеквент). Если антецедент правила истиннен, то по этому правилу можно заключить, что истиннен и консеквент.

Отредактировано ВежливыйЛис (2021-12-22 05:58:44)

0

2

[html]2011-07-29, Daniel Spiewak (перевод: sylvio), Просто о Хиндли-Милнере
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a href="https://habr.com/ru/post/125250/">https://habr.com/ru/post/125250/</a>[/html]

«тип может быть выведен из поддерживаемых им операций»
Я бы сказал из типов аргументов функций, в которых переменная используется (если считать, что операции сложения и т.п. - тоже функции).

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

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

Если функции "first class object", т.е. могут быть значениями переменных, то единственным типом переменных и будет «переменная типа "функция"».
Для нетипизированного лямбда-исчисления воображать из функций всё остальное это нормально.
И всё-таки, если функции с одинаковым именем но с разным количеством аргументов имеют разные типы, то одним типом переменных не обойтись.

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

https://habr.com/ru/post/125250/#comment_4124301

Алгоритм вывода для систем типов Хиндли-Милнера был придуман Дамасом и Милнером. Он подходит для некоторого ряда систем типов, которые обладают общими свойствами. Оригинальная система типов, с которой работали Хиндли и Милнер была простое типизированное лямбда-исчисление. Современные алгоритмы вывода типов в языках Haskell, Ocaml, Standard ML хоть и предназначены для работы с более мощными системами типов, в основе содержат тот же алгоритм.

Язык Scala же, напротив, имеет систему типов, для которой вывод типов по этому алгоритму невозможен. Поэтому она использует другой алгоритм, он придуман Пирсом (local type inference) и улучшен Одерским (colored local type inference). Поэтому иллюстрировать текст про алгоритм Хиндли-Милнера примерами на Скале нехорошо. Спиваку об этом, кстати, несколько раз написали в комментариях к исходному посту. Он ответил, что да, он это сейчас понимает, но на момент написания текста (2008-й год) он этого не знал и текст уже переделывать не станет.

Отредактировано Лис (2021-12-22 06:20:17)

0

3

https://www.youtube.com/watch?v=U1Lw0QfJ1oU

Денис Николаевич Москвин

1) понятие "наиболее общего типа" (principal type, главный тип)

2) Операции над типами

2.1) операция подстановки
вместо переменной типа - выражения типа

2.2) операция унификации
лежит в основе алгоритма

3) теорема Хиндли-Милнера (алгоритм вывода типов)

4) реализация на практике

Пара предыдущих топиков на тему:
1965, J. A. Robinson, A Machine-Oriented Logic Based on the Resolution
Что общего у резолюции (resolution) и у унификации (unification)?

Отредактировано Лис (2021-12-27 19:51:51)

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » вывод типов » алгоритм Хиндли — Милнера (Hindley–Milner type inference algorithm)