Вывод типов типизация
Моде́ль типиза́ции Хи́ндли-Ми́лнера — механизм вывода типов выражений, который реализован в некоторых строгих функциональных языках программирования. Обычно этот механизм реализуется именно в рамках функциональной парадигмы программирования, хотя и не ограничен только ей. Примеры языков, которые используют модель типизации Хиндли-Милнера: Haskell, ML, OCaml, Scala, Fortress и Boo.
Механизм вывода типов основан на возможности автоматически полностью или частично выводить тип выражения, полученного при помощи вычисления некоторого выражения. Так как этот процесс систематически производится во время трансляции программы, транслятор часто может вывести тип переменной или функции без явного указания типов этих объектов. Во многих случаях можно опускать явные декларации типов — это можно делать для достаточно простых объектов, либо для языков с простым синтаксисом. Например, в языке Haskell реализован достаточно мощный механизм вывода типов, а сам синтаксис языка достаточно простой, поэтому указание типов функций в этом языке программирования не требуется. Программист может указать тип функции явно для того, чтобы ограничить её использование только для конкретных типов данных, либо для более структурированного оформления исходного кода.
Для того, чтобы получить информацию для корректного вывода типа выражения в условиях отсутствия явной декларации типа этого выражения, транслятор либо собирает такую информацию из явных деклараций типов подвыражений (переменных, функций), входящих в изучаемое выражение, либо использует неявную информацию о типах атомарных значений. Такой алгоритм не всегда помогает определить тип выражения, особенно в случаях использования функций высших порядков и параметрического полиморфизма достаточно сложной природы. Поэтому в сложных случаях, когда есть необходимость избежать неоднозначностей, рекомендуется явно указывать тип выражений.
Сама модель типизации основана на алгоритме вывода типов выражений, который имеет своим источником механизм получения типов выражений, используемый в типизированном λ-исчислении, который был предложен в 1958 г. Х. Карри и Р. Фейсом. Далее уже́ Роджер Хиндли в 1969 г. расширил сам алгоритм и доказал, что он выводит наиболее общий тип выражения. В 1978 г. Робин Милнер независимо от Р. Хиндли доказал свойства эквивалентного алгоритма. И, наконец, в 1985 г. Луис Дамас окончательно показал, что алгоритм Милнера является законченным и может использоваться для полиморфных типов. В связи с этим алгоритм Хиндли-Милнера иногда называют также и алгоритмом Дамаса-Милнера.
- AWK
- Boo
- F#
- Go
-
Haskell
(диалекты:
Haskell 98,
O'Haskell)
- GHC
- Gofer
- HBI и HBC
- Haskell++
- Helium
- Hugs
- Hugs98 for .NET
- Jaskell
- Jhc
- O'Hugs
- Template Haskell
- YHC
- Yale Haskell
-
nhc98
- nhc98 1.04
- nhc98 1.06
- nhc98 1.08
- nhc98 1.10
- nhc98 1.12
- nhc98 1.14
- nhc98 1.14a
- nhc98 1.16
- nhc98 1.18
- nhc98 pre-release 1
- nhc98 pre-release 10
- nhc98 pre-release 11
- nhc98 pre-release 12
- nhc98 pre-release 13
- nhc98 pre-release 14
- nhc98 pre-release 15
- nhc98 pre-release 16
- nhc98 pre-release 17
- nhc98 pre-release 18
- nhc98 pre-release 19
- nhc98 pre-release 2
- nhc98 pre-release 3
- nhc98 pre-release 4
- nhc98 pre-release 5
- nhc98 pre-release 6
- nhc98 pre-release 7
- nhc98 pre-release 8
- nhc98 pre-release 9
- nhc98 release 1.00
- nhc98 release 1.02
- Io
- Miranda
-
ML
(диалекты:
CAML,
Standard ML)
- Caml Light
- Caml Special Light
- Dependent ML
- Edinburgh ML
- Extended ML
- GAML
- HaMLet
- HaMLet S
- Heavy CAML
- Lazy ML
- ML Kit
- MLj
- MLton
- MOSCOW ML
- MicroML
-
Objective CAML
- Objective Caml 1.00
- Objective Caml 1.01
- Objective Caml 1.02
- Objective Caml 1.03
- Objective Caml 1.04
- Objective Caml 1.05
- Objective Caml 1.06
- Objective Caml 1.07
- Objective Caml 2.00
- Objective Caml 2.01
- Objective Caml 2.02
- Objective Caml 2.03
- Objective Caml 2.04
- Objective Caml 3.00
- Objective Caml 3.01
- Objective Caml 3.02
- Objective Caml 3.03 ALPHA
- Objective Caml 3.04
- Objective Caml 3.05
- Objective Caml 3.06
- Objective Caml 3.07
- Objective Caml 3.08.0
- Objective Caml 3.08.1
- Objective Caml 3.08.2
- Objective Caml 3.08.3
- Objective Caml 3.08.4
- Objective Caml 3.09.0
- Objective Caml 3.09.1
- Objective Caml 3.09.2
- Objective Caml 3.09.3
- Objective Caml 3.10.0
- Objective Caml 3.10.2
- Poly/ML
- SML#
- SML.NET
-
SML/NJ
- SML/NJ 110.41
- SML/NJ 110.43
- SML/NJ 110.40
- SML/NJ 110.42
- SML/NJ 110.44
- SML/NJ 110.45
- SML/NJ 110.46
- SML/NJ 110.47
- SML/NJ 110.48
- SML/NJ 110.49
- SML/NJ 110.50
- SML/NJ 110.51
- SML/NJ 110.52
- SML/NJ 110.53
- SML/NJ 110.54
- SML/NJ 110.55
- SML/NJ 110.56
- SML/NJ 110.57
- SML/NJ 110.58
- SML/NJ 110.59
- SML/NJ 110.60
- SML/NJ 110.61
- SML/NJ 110.62
- SML/NJ 110.63
- SML/NJ 110.63.1
- SML/NJ 110.63.2
- SML/NJ 110.64
- SML/NJ 110.65
- SML/NJ 110.69
- SMLtoJs
- Successor ML
- TILT
- sml2c
- Nemerle