显然以下类型定义是循环
:
type node = int * node;;
Error: The type abbreviation node is cyclic
我的问题是为什么下面的一个不是循环
?
type tree = Node of int * tree;;
第二个定义也引用其自身。
最佳答案
一种看待它的方法是,node
是类型的缩写,而不是新类型本身。因此编译器(或任何感兴趣的人)必须查看内部以了解它的缩写。一旦你深入了解内部,你就会开始注意到一些难以分析的事情(例如,它是一种递归类型,因此可能需要许多展开)。
另一方面,tree
是一种新类型,其特征在于其构造函数。 (在本例中,只有一个构造函数 Node
)。因此编译器(或其他相关方)根本不需要查看内部来确定类型是什么。一旦看到Node
,类型就确定了。就算往里面看,也只需要往下看一层就可以了。这允许递归,而不会造成任何分析困难。
作为一个实际问题,第一类递归类型通常是无意的,并且它们会导致奇怪的类型。第二种类型实际上不可能被错误地创建,因为一路上都有小路标(构造函数);事实上,它们有点像类型系统的命脉。
关于ocaml - OCaml 中的循环类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22093873/