这是我的简化代码:
type t1 = [ `A of t2]
and t2 = [ `B | t1 ]
我知道在这种情况下我不需要“和”,因为我的类型不需要相互定义,但在现实世界中我需要它。 为什么这不起作用?我可以通过这样做让它发挥作用
and t2 = [`B | `C of t1]
但现在我失去了对多态变体的所有兴趣,我只会切换到正常变体。
有什么办法可以做到这一点吗?
最佳答案
在 t2 的定义中,您试图“扩展”类型 t1,此时该类型尚未完全定义(因为它在“A 分支”中需要 t2)。
如果您想“模拟”递归普通数据类型(但使用多态变体),您应该在数据构造函数下使用对相互递归类型的所有引用。
在这种情况下,您的示例可能如下所示:
type t1 = [ `A of t2 ]
and t2 = [ `B | `C of t1 ]
另请注意,在 Ocaml 构造中 [ `B | t1 ] 不意味着用另一行扩展多态行 - 它只是类型同义词替换。
关于ocaml - 类型构造函数尚未完全定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195086/