2017-07-26 54 views
0

我有不同的用戶定義類型,我需要在一個集合中放置。在那一刻,我知道,定義一組模塊,我可以做這樣的事情:定義一個採用用戶自定義類型的集合ocaml

module Mut = Set.Make(struct type t = string ;; let compare = compare end);; 

但是是有可能的,而不是字符串,有我自己的用戶定義類型,像這樣?:

module Mut = Set.Make(struct type t = procexp ;; let compare = compare end);; 

procexp的細節是:

type 'ty procexp = 
    Zero 
| Pproc of string 
| Procdef of 'ty procexp * 'ty procexp 
| Rep of 'ty procexp 
| Par of 'ty procexp * 'ty procexp 
| Concur of 'ty procexp * 'ty procexp 
| Nu of var * 'ty * 'ty procexp * pos 
| Timer of var * var* var * 'ty procexp * 'ty procexp 
| In of var * var * 'ty * 'ty procexp * pos  
| Out of var * 'ty valexp * 'ty procexp * pos 

任何幫助,這是極大的讚賞。謝謝!

回答

0

簡短的回答是肯定的,你可以定義一個包含你提供比較函數的任何類型的集合。對於很多類型,內置多態比較compare是適合的。沒有看到你的類型的細節procexp很難說比這更多。

更新

我沒有注意到你的類型有一個類型參數。抱歉。

這使事情變得更加複雜。標準Set模塊不適用於參數化類型。

一個簡單的工作就是爲每個你想要的具體類型設置一個模塊。例如,您可以輕鬆製作一組int procexp

否則,您需要一種方法將類型參數提供給Set模塊,該模塊(據我所知)意味着爲它定義一個函子。

它可能是這個樣子:

# module type TYPE_PARAM = sig type u end;; 
# module Mut(U: TYPE_PARAM) = Set.Make(struct type t = U.u procexp let compare = compare end);; 

爲了使一組模塊int procexp從這個函子:

# module MutInt = Mut(struct type u = int end);; 
+0

謝謝,我已經更新了procexp – user1514567

+0

的我的細節問題d說這種類型使用'compare'即可。當你認爲'procexp'類型的兩個值相等時,你必須問自己,這是一個基本問題。有時答案與'compare'計算的結果不一樣。 –

+0

感謝您的回答,我會嘗試一下。 – user1514567