3

这是我的简化代码:

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

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

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

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

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

4

1 回答 1

3

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

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

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

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

于 2013-08-12T22:12:01.077 回答