如何在ocaml中混合多态函数和仿函数?

时间:2017-09-03 13:27:00

标签: ocaml functor

我有一个仿函数用于从Comparable模块制作Heap模块,以及一个多态函数将Prim的算法应用于具有任意标签的图形。理想情况下,我希望能够写出如下内容:

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

但是ocamlc说' a是未绑定的。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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仿函数参数传递类型。

但是如果你只是需要一个功能,这可能是矫枉过正的。您可以使用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