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

时间:2013-08-12 19:25:14

标签: ocaml strong-typing typing

这是我的简化代码:

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

我知道在这种情况下我不需要“和”,因为我的类型不需要相互定义,但在现实世界中我需要它。 为什么不起作用?我可以通过

使其工作
and t2 = [`B | `C of t1]

但是现在我失去了我的多态变体的所有兴趣,我将只切换到正常变体。

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

1 个答案:

答案 0 :(得分:3)

在t2的定义中,你试图“扩展”类型t1,此时尚未完全定义(因为它在“A分支”中要求t2)。

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

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

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