如(Cyclic type definition in OCaml)所述,无法定义:
cairo: stable 1.14.8 (bottled), devel 1.15.4, HEAD
==> Dependencies
Build: pkg-config ✘
Required: freetype ✔, fontconfig ✔, libpng ✔, pixman ✔, glib ✔
因为它会导致无限循环,即类型检查和值构造。
但这是合法的:
type t = int * t
构建这些类型的值仍然是不可能的,但可以定义它们。
现在,为什么不能定义?
type t = Node of int * t
type t = { value : int * t; }
这个?
type t = int * (unit -> t)
答案 0 :(得分:4)
规则说在类型和内部递归引用之间必须有一个构造函数。因此Node
和{ value : ... }
记录类型是构造函数。
如果您启用-rectypes
,则可以定义所有这些类型。类型检查没有问题(与你说的相反)。
$ rlwrap ocaml -rectypes
OCaml version 4.03.0
# type t = int * t;;
type t = int * t
# type t = int * (unit -> t);;
type t = int * (unit -> t)
# type t = int * (unit -> t) list;;
type t = int * (unit -> t) list
答案 1 :(得分:2)
除了杰弗瑞的答案之外:你当然可以建立这两种类型的价值观:
# type t = Node of int * t ;;
# let rec x = Node (3, x) ;;
val x : t = Node (3, <cycle>)
它不是有限的,但这不是一个真正的问题,不是吗? ;)