1

对于如下循环:

let rec loop () = loop ()

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

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

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

4

2 回答 2

4

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

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

于 2018-02-19T10:00:43.483 回答
4

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

于 2018-02-19T09:57:34.483 回答