我想扩展一个模块,但我需要访问它的私有组件。这是一个例子:
nat.mli:
type t
val zero : t
val succ : t -> t
nat.ml:
type t = int
let zero = 0
let succ x = x + 1
我想定义一个定义函数的新Ext_nat
模块double
。我试图做这样的事情。
ext_nat.mli:
include (module type of Nat)
val double : t -> t
ext_nat.ml:
include Nat
let double x = 2 * x
它不起作用,因为我无法访问x
最后一行中的表示。
现在我正在考虑这个问题,无论如何这可能不是一个好主意,因为这会破坏nat
. 那么最好的方法是什么?我可以在签名中定义一个新模块nat_public
,并使用私有. 你怎么看?type t = int
nat
ext_nat
type t