Механізм виведення типів базується на можливості автоматично повністю або частково виводити тип виразу, отриманого за допомогою обчислення деякого виразу. Оскільки цей процес систематично проводиться під час трансляції програми, транслятор часто може вивести тип змінної або функції без явного вказування типів цих об'єктів. В багатьох випадках можна опускати явні декларації типів — це можна робити для достатньо простих об'єктів, або для мов з простим синтаксисом. Наприклад, в мові 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.(англ.)
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. (англ.)