OCaml等效类型

Ed *_*Man 6 ocaml types

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

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

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

ygr*_*rek 8

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


nlu*_*oni 2

你不必使用Obj.magic,尽管你确实必须使用一些“魔法”,

external convertAB : A.t -> B.t = "%identity"
external convertBA : B.t -> A.t = "%identity"
Run Code Online (Sandbox Code Playgroud)

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

  • 我相信你知道这一点,但是使用 `"%identity"` 与使用 `Obj.magic` 完全一样(事实上“相同”)。如果可能的话,您确实想避免它们。 (3认同)