Я думал о том, как работает вывод типа в следующей программе 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".
Какова его магия?