显然,以下类型定义为cyclic
:
type node = int * node;;
Error: The type abbreviation node is cyclic
我的问题是以下是not cyclic
怎么来的?
type tree = Node of int * tree;;
第二个定义也指自己。
答案 0 :(得分:2)
查看它的一种方法是node
是类型的缩写,而不是新类型本身。所以编译器(或任何感兴趣的人)必须向内看,看看它的缩写是什么。一旦你看到内部,你就会开始注意到难以分析的东西(例如,它是一个递归类型,因此可能需要很多展开)。
另一方面,tree
是一种以其构造函数为特征的新类型。 (在这种情况下,只有一个构造函数Node
)。因此,编译器(或其他感兴趣的一方)并不需要查看内部以确定类型是什么。看到Node
后,确定了类型。即使你向内看,你也只需向下看一个级别。这允许递归而不会在分析中造成任何困难。
实际上,第一种类型的递归类型通常是无意识的,它们会导致奇怪的类型。由于一路上的小路标(构造函数),第二种类型几乎不可能被错误地创建;事实上,它们有点像类型系统的生命线。