Ocaml 类型构造函数尚未完全定义

Ocaml 类型构造函数尚未完全定义,ocaml,strong-typing,typing,Ocaml,Strong Typing,Typing,以下是我的简化代码: type t1 = [ `A of t2] and t2 = [ `B | t1 ] 我知道在这种情况下我不需要“and”,因为我的类型不需要相互定义,但在现实世界中我需要它。 为什么不起作用?我可以通过这样做来让它工作 and t2 = [`B | `C of t1] 但是现在我对我的多态性变体失去了兴趣,我将切换到正常变体 有什么方法可以做到这一点吗?在t2的定义中,您试图“扩展”类型t1,但此时还没有完全定义它(因为它需要分支中的t2) 如果您想“模拟”递归普通数

以下是我的简化代码:

type t1 = [ `A of t2]
and t2 = [ `B | t1 ]
我知道在这种情况下我不需要“and”,因为我的类型不需要相互定义,但在现实世界中我需要它。 为什么不起作用?我可以通过这样做来让它工作

and t2 = [`B | `C of t1]
但是现在我对我的多态性变体失去了兴趣,我将切换到正常变体


有什么方法可以做到这一点吗?

在t2的定义中,您试图“扩展”类型t1,但此时还没有完全定义它(因为它需要分支中的t2)

如果您想“模拟”递归普通数据类型(但改用多态变量),则应在数据构造函数下使用对相互递归类型的所有引用。
本例中的示例可能如下所示:

type t1 = [ `A of t2 ]
and t2 = [ `B | `C of t1 ]

还请注意,在Ocaml构造中,[`B | t1]并不意味着用另一行扩展多态行-它只是类型同义词替换。

我知道,我在我的问题中写道:)。我不理解扩展类型和使用同义词之间的区别。在ocaml中似乎并没有任何区别。我仍然不明白为什么它可以和“C”一起工作,但不能没有它。@double\u在这种情况下,您对编译器的期望是什么?Ocaml试图将其“展开”到[A of[B | A of[B | A of…]],这是无限的,因此这是一个错误。有了'C,它可以展开到[A of[B | C of'A]作为'A],这是完全可以的。为什么不[A of[B | A of'A]作为'A]?我的意思是,事实上是一样的,至少在我看来是一样的。我不明白为什么编译器可以在一种情况下得到它,但在另一种情况下却不能。