OCaml中的循环类型定义

OCaml中的循环类型定义,ocaml,Ocaml,显然,以下类型定义是循环的: type node = int * node;; Error: The type abbreviation node is cyclic 我的问题是为什么下面的一个是而不是循环的 type tree = Node of int * tree;; 第二个定义也指它自己。一种看待它的方式是,节点是一种类型的缩写,而不是新类型本身。因此,编译器(或任何感兴趣的人)必须查看内部,看看它是什么缩写。一旦你看了里面,你开始注意到一些使分析变得困难的事情(例如,它是一种递

显然,以下类型定义是循环的:

type node = int * node;;
Error: The type abbreviation node is cyclic 

我的问题是为什么下面的一个是
而不是循环的

type tree = Node of int * tree;;

第二个定义也指它自己。

一种看待它的方式是,
节点
是一种类型的缩写,而不是新类型本身。因此,编译器(或任何感兴趣的人)必须查看内部,看看它是什么缩写。一旦你看了里面,你开始注意到一些使分析变得困难的事情(例如,它是一种递归类型,因此可能需要许多展开)

另一方面,
tree
是一种新的类型,其特点是其构造函数。(在本例中,只需一个构造函数
节点
)。因此,编译器(或其他相关方)根本不需要查看内部来确定类型。一旦您看到
节点
类型就确定了。即使你往里看,你也只需要往下看一层。这允许递归,而不会在分析中造成任何困难


实际上,第一类递归类型通常是无意的,它们会导致奇怪的键入。第二类几乎不可能错误地创建,因为一路上都有小路标(构造器);事实上,它们有点像类型系统的生命线。

不同之处在于,在类型检查时,您不会冒险无限地展开定义:必须应用构造函数
节点
才能将类型
展开为
int*树
@gallais您能将注释转换为更详细的注释吗回答?请注意,您实际上可以使用
-rectypes
选项允许此类类型(这将禁用类型检查/推断机制的发生检查)。