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

标签 ocaml strong-typing typing

这是我的简化代码:

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/

相关文章:

events - bbvEventBroker 强类型且没有魔法字符串

client-side - 强类型的客户端语言?

javascript - 如何让 TS 编译器知道对象中存在函数?

python - __init__ 的正确类型注释

ocaml - 如何使用 Jane Street 的 Core with Reason?

ocaml - 如何使用 ppx 为数据类型派生 to_string 方法

polymorphism - OCaml:具有通用键的 map 上的多态函数

javascript - 如何在 ReasonML 中进行 protobuf?

strong-typing - 你封装标量吗?

python - Python 中的受限泛型类型提示