2017-09-03 64 views
0

我有一个仿函数来从一个Comparable模块创建一个Heap模块,并且有一个多态函数将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说'a是没有限制的。我如何解决这个问题?

回答

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