OCaml标识类型

时间:2018-06-13 18:22:26

标签: types ocaml

我正在学习OCaml。我对Haskell等其他函数语言有一些基础知识,所以对我来说并不是全新的。 Here是我正在努力解决的一些任务(这里的任务,就是用适合的类型替换问号)。我没有得到2c:

let forever (x : ??) : ?? =
  forever forever
;; 

首先它应该是let rec forever,对吧?

我想过unit,但我的编译器说这不是有效的OCaml。你有什么提示吗?我认为它不应该对任何类型都有效,但是谁知道,也许我错过了任何OCaml的秘密。

1 个答案:

答案 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章,类型和编程语言中阅读有关递归类型的内容。

相关问题