对于如下的循环:
let rec loop () = loop ()
根据try.ocamlpro.com的签名是:
val loop : unit -> 'a = <fun>
为什么会这样? loop()永远不会停止调用自己,所以不应该返回任何东西吗?
答案 0 :(得分:4)
是的,它应该,这正是unit -> 'a
的意思:给定调用者要求的任何类型'a
,函数承诺返回'a
。
答案 1 :(得分:4)
我确信某人可以而且将会确切地解释这是如何被推断的,但它是Hindley-Milner类型系统及其推理算法的一个属性,它能够推断出最常见的类型一种表达。这当然是'a
,它将与任何事物统一起来。
所以,直观地说,如果你从最常见的类型'a
开始,那么尝试找到缩小它的约束,在这种情况下你不会找到任何东西。可以约束它的唯一表达式是递归调用,我们已经假设它是'a
,所以没有冲突。