OCaml#2中的循环类型定义

时间:2017-06-01 18:40:53

标签: ocaml

如(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)

2 个答案:

答案 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>)

它不是有限的,但这不是一个真正的问题,不是吗? ;)