I'm making a strongly typed toy functional programming language. It uses the Hindley Milner algorithm as type inference algorithm.
Implementing the algorithm, I have a question on how to infer types of the mutually recursive functions.
let rec f n = if n == 0 then 0 else g (n - 1)
let rec g n = if n == 0 then 0 else f (n - 1)
f
and g
are mutually recursive functions. Now, when the type checker is inferring the type of function f
, it should also be able to infer the type of function g
, since it is a subexpression.
But, in that moment, function g
is not defined yet. Therefore, the type checker doesn't even know the existence of function g
, as well as the type of function g
, obviously.
What are some solutions that real world compilers/intepreters use?
unify
function, maybe without actually deeply understanding it. – suhdonghwi