显然,下面的类型定义是cyclic
type node = int * node;;
Error: The type abbreviation node is cyclic 我的问题是怎么来的,下面的一个是not cyclic
type tree = Node of int * tree;;第二个定义也涉及其本身。
发布于 2014-02-28 15:51:48
可以这样看,node是一种类型的缩写,而不是新类型本身的缩写。所以编译器(或任何感兴趣的人)必须查看内部,看看它是什么缩写。一旦您查看了内部,您就会注意到一些使您难以分析的事情(例如,它是一种递归类型,因此可能需要许多展开)。
另一方面,tree是一种以构造函数为特征的新型类型。(在本例中,只有一个构造函数Node)。因此编译器(或其他感兴趣的方面)根本不需要查看内部来确定类型是什么。一旦您看到Node,类型就确定了。即使你看了里面,你也只需要往下看一层。这允许递归,而不会造成分析上的任何困难。
实际上,第一类递归类型通常是无意的,它们会导致奇怪的类型。第二类几乎不可能错误地创建,因为在整个过程中都有小路标(构造器);实际上,它们有点像类型系统的命脉。
https://stackoverflow.com/questions/22093873
复制相似问题