Я думал о том, как определение типа работает в следующей программе OCaml:Тип вывода с взаимной рекурсии
let rec f x = (g x) + 5
and g x = f (x + 5);;
Конечно, программа совершенно бесполезно (зацикливания), но то, что о типах? OCaml говорит:
val f : int -> int = <fun>
val g : int -> int = <fun>
Это точно моя интуиция, но как алгоритм вывода типа это знать?
Скажем, что алгоритм считает «f» первым: единственным ограничением, которое он может получить, является то, что возвращаемый тип «g» должен быть «int», и поэтому его собственный тип возврата также «int». Но он не может вывести тип своего аргумента по определению «f».
С другой стороны, если он сначала рассматривает «g», он может видеть, что тип его собственного аргумента должен быть «int». Но, не считая «f» раньше, он не может знать, что возвращаемый тип «g» также является «int».
Какая у него магия?
В настоящем документе обсуждаются следующие вопросы: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.388.430&rep=rep1&type=pdf – Jeremy