推断类型的无限递归函数

时间:2018-02-19 09:34:12

标签: ocaml type-inference hindley-milner

对于如下的循环:

let rec loop () = loop ()

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

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

为什么会这样? loop()永远不会停止调用自己,所以不应该返回任何东西吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我确信某人可以而且将会确切地解释这是如何被推断的,但它是Hindley-Milner类型系统及其推理算法的一个属性,它能够推断出最常见的类型一种表达。这当然是'a,它将与任何事物统一起来。

所以,直观地说,如果你从最常见的类型'a开始,那么尝试找到缩小它的约束,在这种情况下你不会找到任何东西。可以约束它的唯一表达式是递归调用,我们已经假设它是'a,所以没有冲突。