定义一个接受用户定义类型ocaml的Set

时间:2017-07-26 20:04:11

标签: ocaml

我有各种用户定义的类型,我需要放在一个集合中。目前,我知道要定义一个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   

非常感谢任何帮助。谢谢!

1 个答案:

答案 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);;