2017-10-17 3 views
2

私が最終的にしようとしているのは、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.TYPEConcat mliはほとんど同じです。私がconcat_type.mlを作成した唯一の理由は、Joinというファンクタをサポートし、concatの実装を模倣したモジュールにそれを適用しようとすると、何が見えるのかを明示的に制限することでした。

Concat_type.TYPEConcatインターフェイスにインポートする方法、またはその逆、またはそれらの間の重複を避けるために他の方法をインポートする方法はありますか?

+1

、私は – glennsl

+2

あなたが'モジュールが参加し、例えば、 'Concat'のモジュールタイプを使用することができると思います(X:Concatのモジュールタイプ):sig ... '。 – gsg

答えて

1

はい、モジュールタイプConcat_type.TYPEを使用してConcatモジュールインターフェイスを表すことができます。既存のモジュールのモジュールタイプを取得することもできます。

最初のアプローチは、次のようになります。

(* concat.mli *) 
include Concat_type.TYPE 

第二のアプローチは、私が個人的にそれを嫌うのに、私はmodule type of構造物を好きではないとして、あなたは、Concat_typeを取り除くことができます。しかし、まだ、可能性があります:あなたはちょうど `concat.mliでConcat_type.TYPE`を含める使用することができるはず

module type Concat = module type of Concat 

module Join (X : Concat) = struct 
    ... 
end 
関連する問題