4
從地圖擴展模塊我有給定類型String
函子Map.Make
內置模塊StringMap
:OCaml中
module StringMap = Map.Make(String)
除了由Map
所規定的正常運作,我想在此模塊中增加更多的定義,例如,my_own_function
,這樣我可以撥打StringMap.my_own_function
。有誰知道我應該在哪裏定義這種功能和他們的簽名?
從地圖擴展模塊我有給定類型String
函子Map.Make
內置模塊StringMap
:OCaml中
module StringMap = Map.Make(String)
除了由Map
所規定的正常運作,我想在此模塊中增加更多的定義,例如,my_own_function
,這樣我可以撥打StringMap.my_own_function
。有誰知道我應該在哪裏定義這種功能和他們的簽名?
您可以在新模塊中使用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
這不完全是您想向潛在初學者詢問Caml問題的事情。我認爲這不是一個好主意,就好像它是一種合理的做法。如果你希望公開一個平衡的樹實現,請做到這一點(和Batteries用[BatAvlTree](http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatAvlTree.html))做到這一點,但打破抽象並不是一個好主意...... – gasche 2011-12-28 15:17:41
完全同意,希望他找到答案的第一部分足以供他使用。 – nlucaroni 2011-12-28 15:41:23