let rec loop (x:?) : ? =
loop loop
是否有任何类型替代?
,允许此功能loop
进行类型检查?
如果你向解释器提供-rectypes
,它将告诉你函数的类型:
$ ocaml -rectypes
OCaml version 4.02.1
# let rec loop x = loop loop;;
val loop : 'a -> 'b as 'a = <fun>
您可以为参数和返回类型使用单独的类型变量来声明该函数,但(在我看来)这似乎与不指定类型相同。
# let rec loop (x: 'a) : 'b = loop loop;;
val loop : 'a -> 'b as 'a = <fun>
如果不允许递归类型(使用-rectypes
),则该函数不能进行类型检查,因为它的类型是递归的。