2011-12-28 28 views
4

从地图扩展模块我有给定类型String函子Map.Make内置模块StringMapOCaml中

module StringMap = Map.Make(String) 

除了由Map所规定的正常运作,我想在此模块中增加更多的定义,例如,my_own_function,这样我可以拨打StringMap.my_own_function。有谁知道我应该在哪里定义这种功能和他们的签名?

回答

6

您可以在新模块中使用include关键字来添加所有相同的功能。这也延伸到signature in OCaml 3.12

module StringMap = 
    struct 
     include Map.Make(String) 
    end 

如果您要访问的地图结构,你就必须添加一些Obj.magic%identity特殊外部函数。该类型的重新定义必须准确,因为没有类型检查正在发生,

module Make (Ord : Map.OrderedType) = 
    struct 
     include Map.Make(Ord) 

     type 'a impl = Empty 
        | Node of 'a impl * key * 'a * 'a impl * int 

     external impl_of_t : 'a t -> 'a impl = "%identity" 
     external t_of_impl : 'a impl -> 'a t = "%identity" 

     let cardinal map = 
      let rec cardinal = function 
       | Empty -> 0 
       | Node(l,_,_,r,_) -> cardinal l + 1 + cardinal r 
      in 
      cardinal (impl_of_t map) 

    end 
+0

这不完全是您想向潜在初学者询问Caml问题的事情。我认为这不是一个好主意,就好像它是一种合理的做法。如果你希望公开一个平衡的树实现,请做到这一点(和Batteries用[BatAvlTree](http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatAvlTree.html))做到这一点,但打破抽象并不是一个好主意...... – gasche 2011-12-28 15:17:41

+0

完全同意,希望他找到答案的第一部分足以供他使用。 – nlucaroni 2011-12-28 15:41:23