我正在学习OCaml。我对Haskell等其他函数语言有一些基础知识,所以对我来说并不是全新的。 Here是我正在努力解决的一些任务(这里的任务,就是用适合的类型替换问号)。我没有得到2c:
let forever (x : ??) : ?? =
forever forever
;;
首先它应该是let rec forever
,对吧?
我想过unit
,但我的编译器说这不是有效的OCaml。你有什么提示吗?我认为它不应该对任何类型都有效,但是谁知道,也许我错过了任何OCaml的秘密。
答案 0 :(得分:3)
是的,forever
需要在OCaml中声明为递归。你有
let rec forever x = forever forever
函数forever
接受一个参数。由于表达式forever forever
,您知道参数的类型与forever
本身的类型相同。
很少有类型会出现这种情况。当然,forever
的参数类型必须至少是函数类型。
由于forever
接受它自己的类型,因此它的类型是递归的。在许多函数语言中,不支持这样的类型。但是如果在命令行中指定-rectypes
,则可以在OCaml中使用它们。
所以你可以试试这个:
$ ocaml -rectypes
# let rec forever x = forever forever;;
OCaml会告诉您它推断forever
的类型。
<强>更新强>
值得指出的是,这些是OCaml类型系统的有趣角落,而且通常是类型理论。但是你在实践中不会看到这样的类型(或代码)。
您可以在Pierce的第20章和第21章,类型和编程语言中阅读有关递归类型的内容。