我可以"输入"一个条目=字符串*'a*'一个条目;;`在OCaml中?

Jac*_*ale 1 ocaml functional-programming

看来我做不到.

我想明白为什么我不能.

我肯定能做到type 'a entry = Empty | Value of string * 'a * 'a entry;;,所以如果我想递归地定义一个类型,我只能去union路线?

Jef*_*eld 6

你的问题是混乱,因为它仅提到的类型,你希望使用!但是,我从你的标题中看到你想要使用直接递归类型.

如果您想直接递归类型,则需要打开-rectypes命令行.但是,这并不是你真正想要做的事情.它允许太多的类型真的是不是你想要的.

$ ocaml
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
Error: The type abbreviation entry is cyclic
# ^D
$ ocaml -rectypes
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
type 'a entry = string * 'a * 'a entry
# 
Run Code Online (Sandbox Code Playgroud)

-rectypes默认情况下未启用的原因是它允许将类型赋予实际编码错误的许多表达式.总的来说,额外的灵活性不值得放弃额外的错误检测.

这是我在旧的OCaml邮件列表消息中找到的一个例子:

$ ocaml -rectypes
        OCaml version 4.00.0

# let f x = x :: x;;
val f : ('a list as 'a) -> 'a list = <fun>
# 
Run Code Online (Sandbox Code Playgroud)

随着-rectypes开启,这相当荒谬的功能被接受.但实际上它只适用于相当奇怪的列表类型.程序员很可能意味着使用而不是列表附加到自身.不幸的是,直到很久以后才会检测到此错误.@::-rectypes

作为一个侧面评论,正如newacct指出的那样,你可能很快就会发现标题中的类型不是那么有用.它实际上只能代表循环或无限结构.这是没有工作的另一个原因-rectypes并不太难.