OCaml中的循环类型定义

时间:2014-02-28 11:26:34

标签: ocaml

显然,以下类型定义为cyclic

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

我的问题是以下是not cyclic怎么来的?

type tree = Node of int * tree;;

第二个定义也指自己。

1 个答案:

答案 0 :(得分:2)

查看它的一种方法是node是类型的缩写,而不是新类型本身。所以编译器(或任何感兴趣的人)必须向内看,看看它的缩写是什么。一旦你看到内部,你就会开始注意到难以分析的东西(例如,它是一个递归类型,因此可能需要很多展开)。

另一方面,tree是一种以其构造函数为特征的新类型。 (在这种情况下,只有一个构造函数Node)。因此,编译器(或其他感兴趣的一方)并不需要查看内部以确定类型是什么。看到Node后,确定了类型。即使你向内看,你也只需向下看一个级别。这允许递归而不会在分析中造成任何困难。

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