Я работаю над простой системой на основе потока данных (представьте, что это как редактор LabView/runtime), написанный на Java. Пользователь может связывать блоки вместе в редакторе, и мне нужен вывод типа, чтобы гарантировать правильность графика потока данных, однако большинство примеров вывода типов написаны в математических обозначениях: ML, Scala, Perl и т.д., Которые я не "говорить".
Я прочитал о алгоритме Хиндли-Милнера и нашел этот документ с хорошим примером, который я мог бы реализовать. Он работает с множеством ограничений T1 = T2. Тем не менее, мои графики потока данных переходят на T1 >= T2, подобные ограничениям (или T2 расширяет T1, или ковариацию, или T1 <: T2, как я видел это в разных статьях). Нет lambdas, просто введите переменные (используемые в общих функциях типа T merge(T in1, T in2)
) и конкретные типы.
Повторить алгоритм HM:
Type = {TypeVariable, ConcreteType}
TypeRelation = {LeftType, RightType}
Substitution = {OldType, NewType}
TypeRelations = set of TypeRelation
Substitutions = set of Substitution
1) Initialize TypeRelations to the constraints, Initialize Substitutions to empty
2) Take a TypeRelation
3) If LeftType and RightType are both TypeVariables or are concrete
types with LeftType <: RightType Then do nothing
4) If only LeftType is a TypeVariable Then
replace all occurrences of RightType in TypeRelations and Substitutions
put LeftType, RightType into Substitutions
5) If only RightType is a TypeVariable then
replace all occurrences of LeftType in TypeRelations and Substitutions
put RightType, LeftType into Substitutions
6) Else fail
Как я могу изменить исходный алгоритм HM для работы с этими отношениями вместо простых отношений равенства? Пример Java-ish или объяснение было бы очень оценено.