这是我的简化代码:
type t1 = [ `A of t2]
and t2 = [ `B | t1 ]
我知道在这种情况下我不需要“和”,因为我的类型不需要相互定义,但在现实世界中我需要它。 为什么不起作用?我可以通过
使其工作and t2 = [`B | `C of t1]
但是现在我失去了我的多态变体的所有兴趣,我将只切换到正常变体。
我有什么方法可以做到这一点吗?
答案 0 :(得分:3)
在t2的定义中,你试图“扩展”类型t1,此时尚未完全定义(因为它在“A分支”中要求t2)。
如果要“模拟”递归普通数据类型(但使用多态变体),则应在数据构造函数下使用对相互递归类型的所有引用。
在这种情况下,您的示例可能如下所示:
type t1 = [ `A of t2 ]
and t2 = [ `B | `C of t1 ]
另请注意,在Ocaml构造中[`B | t1] 不意味着用另一行扩展多态行 - 它只是类型同义词替换。