2017-09-03 13 views
0

私は、Comparableモジュールからヒープモジュールを作成するファンクタと、Primのアルゴリズムを任意のラベルを持つグラフに適用する多相関数を持っています。理想的には私のような何か書くことができるようにしたい:多型関数をocamlのファンクタとどのように混合するのですか?

let prim (graph: 'a graph)= 
    let module EdgeHeap=Heap.Make(
     struct 
      type t='a edge 
      ... 
     end 
    ) in 
    ... 
    let heap=EdgeHeap.create() in 
    ... 

を結合していないが、ある」ということはocamlc言います。これを回避するにはどうしたらいいですか?

答えて

2

通常、グラフモジュールシグネチャでパラメータ化されたファンクタ内には、prim(関連するファンクションとともに)があります。私。次のようになります。

module type GraphSpec = sig 
    type t 
    ... 
end 

module GraphAlgorithms(G: GraphSpec) = struct 
    type graph = ... 
    module EdgeHeap = Heap.Make(struct 
    type t = G.t edge 
    ... 
    end) 
    let prim (g: graph) = ... 
    let kruskal (g: graph) = ... 
end 

これは、型変数の使用を避けます。代わりに、GraphSpecファンクション引数を使用して型を渡します。

しかし、1つの機能に必要なだけの場合は、これが過剰です。 locally abstract typesを使用して回避することができます。その仕組みを説明する簡単な例:

let min_list (type u) (l: u list) = 
    let module S = Set.Make(struct 
    type t = u 
    let compare = compare 
    end) in 
    S.of_list l |> S.min_elt 
関連する問題