私が最終的にしようとしているのは、1)可視性をモジュール(したがってmliファイル)に制限し、2)引数が "ソースツリー内に存在する「実装」をml
/mli
のペアとして扱い、引数がこの正式な実装と同じ形状を持つことを主張します。OCamlはmliファイルとmlmファイル内のシグネチャとの間の構造を共有します
は、私は、文字列の連結のための単一の関数を含むファイルconcat.ml
(* concat.ml *)
type t = string
let concat x y = x^y
を持っていると私はしかし、私はまたのように見えるファンクタjoin
をそれ
(* concat.mli *)
type t
val concat : t -> t -> t
ためのインタフェースを持っていると仮定しますこれはConcat
と同じ形のものを期待しています。 (join
の実装は意図的にナイーブである):
(* join.ml *)
module Join(X : Concat_type.TYPE) : sig
val join : X.t list -> X.t
end = struct
let rec join xs = match xs with
| [] -> failwith "can't be empty"
| [x] -> x
| [x; y] -> X.concat x y
| (x::xs') -> X.concat x (join xs')
end
制約「連結と同じ形状」を表現するために、私はこのようになります別のml
ファイルconcat_type.ml
作るために持っていた:
(* concat_type.ml *)
module type TYPE = sig
type t
val concat : t -> t -> t
end
をこの場合、
Concat_type.TYPE
とConcat
mliはほとんど同じです。私がconcat_type.ml
を作成した唯一の理由は、Join
というファンクタをサポートし、concat
の実装を模倣したモジュールにそれを適用しようとすると、何が見えるのかを明示的に制限することでした。
Concat_type.TYPE
をConcat
インターフェイスにインポートする方法、またはその逆、またはそれらの間の重複を避けるために他の方法をインポートする方法はありますか?
、私は – glennsl
あなたが'モジュールが参加し、例えば、 'Concat'のモジュールタイプを使用することができると思います(X:Concatのモジュールタイプ):sig ... '。 – gsg