我正在制作一种强类型玩具函数式编程语言。它使用 Hindley Milner 算法作为类型推断算法。
实现该算法,我有一个关于如何推断相互递归函数的类型的问题。
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
并且g
是相互递归的函数。现在,当类型检查器推断 function 的类型时f
,它也应该能够推断 function 的类型g
,因为它是一个子表达式。
但是,在那一刻,功能g
还没有定义。因此,类型检查器显然甚至不知道 function 的存在以及 functiong
的类型g
。
现实世界的编译器/解释器使用哪些解决方案?