无限递归函数的推断类型

Inferred type of an infinitely recursive function

对于如下循环:

let rec loop () = loop ()

根据try.ocamlpro.com的签名是:

val loop : unit -> 'a = <fun>

为什么会这样? loop() 永远不会停止调用自己所以它不应该 return 什么吗?

是的,它应该,这正是 unit -> 'a 的意思:给定调用者要求的任何类型 'a,该函数承诺 return 和 'a

我相信有人可以并且将会解释这是如何推断的,但它是 Hindley-Milner 类型系统的 属性 及其推理算法,它将能够推导出最一般的表达式类型。那当然是 'a,它将与任何事物统一。

因此,凭直觉,如果您从最一般的类型开始,'a,然后尝试找到缩小它的约束,在这种情况下您将找不到任何东西。唯一可以约束它的表达式是递归调用,我们已经假设它是'a,所以没有冲突。