3

A と B の 2 つのモジュールがあり、モジュール A で型を定義すると、

type t1 = THIS of int | THAT of char

次に、モジュール B でそのタイプのパターン マッチングまたはオブジェクトの構築を行いたい場合は、次のようなものを使用する必要があります。

A.THIS(3)

これは、次のようなステートメントがあった後でも、私に強制するものです

type t2 = A.t1

モジュールの署名と実装で。冗長性を減らして「A」を使用しないようにしたい場合はどうすればよいでしょうか。モジュールBで?まったく新しい型と、ある型を別の型に変換する関数を作成できますが、これは扱いにくいようです。足りないものはありますか?

4

2 に答える 2

8

openJava の に似たキーワードを使用できますimport

module A = struct
  type t1 = THIS of int | THAT of char
end

module B = struct
  open A
  let b = THIS 3
end

module のグローバル名前空間の汚染を避けたい場合は、OCaml 3.12 で導入されBを使用できます。let open ... in ...

module A = struct
  type t1 = THIS of int | THAT of char
end

module B = struct
  let b = let open A in THIS 3
end

includeいくつかの特別な (そして比較的まれな) ケースでは、代わりにキーワードを使用したい、または使用しなければならない場合がありますopen。OCamlマニュアルのモジュールパスを開くセクションと別の構造のコンポーネントを含めるセクションで、それらの違いについての良い説明を見つけることができます。

于 2012-08-04T05:17:55.650 に答える
5

私はモジュールの専門家ではありませんが、これを行うことができます (テストしたところです)。

(b.ml):

type t1 = A.t1 = THIS of int | THAT of char

openもちろん、Aモジュールも可能です。多くの場合、これは私の好みには激しすぎます。抜本的でなくするために、3 番目のモジュールで型を定義し、A と B の両方で開くことができます。

于 2012-08-04T05:14:30.110 に答える