OCaml等效类型

时间:2012-02-15 14:36:11

标签: types ocaml

我在OCaml中构建了两个包含相同变体类型的库。变体的细节并不太重要,除了它非常大,并且为它手动编写转换函数会很烦人。 (它实际上是使用ocamlidl从C转换而来的bfd_architecture枚举。)

我现在正在使用这两个库编写程序。特别是,我正在调用A.f,它返回A.variant_type的值,我需要在调用B.g时使用该值,该值将B.variant_type的值作为输入。

有没有办法告诉OCaml A.variant_type和B.variant_type实际上是同一类型,因此可以将值从一个转换为另一个?这些库是独立的,因此它们不应该相互引用。现在我正在使用Obj.magic来进行转换,但这是一个黑客攻击。

3 个答案:

答案 0 :(得分:8)

我相信没有干净的方法,除非这些库有一些共同的依赖关系来定义这种类型(即在构建时从两个库引用的相同模块)。

答案 1 :(得分:3)

如果您确实希望变体类型出现在两个库中,您还可以强制检查它们是否相同。在第二个库中,您可以写:

type t = OtherLib.t = | A | B | C | ...

这将使编译器验证OtherLib.t = A | B | C | ......并使两种类型相等。我不认为这真的能解决你的问题,因为你可能不想改变任何一个库。

当我想保留不同版本的类型时,我通常会这样做(因为它们保存在我想要稍后阅读的文件中),并且我希望每个版本都明确构造函数,同时尽可能保持当前的等价版本

答案 2 :(得分:1)

你不必使用Obj.magic,虽然你必须使用一些“魔法”,

external convertAB : A.t -> B.t = "%identity"
external convertBA : B.t -> A.t = "%identity"

足以进行转换。当然,我理解你的担忧;两种类型必须完全相同,否则你将处理运行时错误。如果它完全可行且相关,将这些变体转换为Polymorphic Variants将解决问题。