1
我想扩展一个模块,但我需要访问其私有组件。这里有一个例子:在OCaml中公开模块扩展的私有类型
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
。你怎么看?