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
。你怎麼看?