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