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