2017-09-01 10 views
1

モジュールを拡張したいが、プライベートコンポーネントにアクセスする必要がある。私はdouble関数を定義して、新しいモジュールExt_natを定義したいと思います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.mli: 
include (module type of Nat) 
val double : t -> t 

ext_nat.ml: 
include Nat 
let double x = 2 * x 

私は最後の行のxの表現へのアクセスを持っていないように、それは働いていません。

私はこれについて考えていますが、とにかくこれがカプセル化を中断するのはnatなのではないでしょう。では、これを行う最善の方法は何ですか?新しいモジュールnat_publicを定義することができます。ここでは、natext_natをプライベートtype tと定義しています。どう思いますか?

答えて

1

with typeステートメントを使用する必要があります。下のコードをさまざまな方法で記述することは可能ですが、その考え方は常に同じです。

module type NatSig = 
    sig 
    type t 
    val zero : t 
    val succ : t -> t 
    end 

module type ExtNatSig = 
    sig 
    include NatSig 
    val double : t -> t 
    end 

module ExtNat : ExtNatSig = 
    struct 
    type t = int 
    let zero = 0 
    let succ = fun x -> x + 1 
    let double = fun x -> x * 2 
    end 

module Nat = (ExtNat : NatSig with type t = ExtNat.t) 

let z = Nat.zero 
let _ = ExtNat.double z 

の問題は、私が覚えている限りでは、それはあなたのファイル構造で、この動作を実現することは不可能だということです:あなたは.mlの中.mliのファイルや構造自体に署名を使用して暗黙的にあなたのモジュールを定義するので、あなたはしないでくださいモジュールを十分に制御できます。そのため、コードを少し再編成することをお勧めします(問題でない場合)。

関連する問題