我有各种用户定义的类型,我需要放在一个集合中。目前,我知道要定义一个set模块,我可以这样做:
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 :(得分:0)
简短的回答是肯定的,您可以定义一个包含您为其提供比较功能的任何类型的集合。对于许多类型,内置的多态比较compare
是合适的。如果没有看到您的类型procexp
的详细信息,则很难说明这一点。
<强>更新强>
我没注意到你的类型有一个类型参数。遗憾。
这使事情变得更加复杂。标准的Set模块不适用于参数化类型。
一个简单的工作方法是为您想要的每种具体类型创建一个模块。例如,您可以轻松制作一组int procexp
。
否则你需要一种方法来为Set模块提供type参数,(据我所知)这意味着为它定义一个仿函数。
它可能看起来像这样:
# 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);;