假设我有一个类型定义为
type value =
None
| Int of int
| Float of float
| Complex of Complex.t
| String of string
| Char of char
| Bool of bool
我希望能够使用 Sets
这些值。据我了解,我必须使用仿函数来具体化 Set
具有具体类型及其关联顺序的模块。
在这个例子中我应该怎么做?自 value
不能直接在Set.Make
里面使用仿函数?
当然,我需要能够对这些值进行完整排序,所以我应该发明一些东西,比如为不同类型提供预定义顺序,然后按它们的有效值对它们进行排序。我说得对吗?
例如,我可以决定 Int of int < Float of int
和 Int x < Int y
如果x < y
.这是实现我想要实现的目标的实用方法吗?
最佳答案
Set.Make仿函数采用签名为 Set.OrderedType 的模块:
module type OrderedType = sig type t val compare : t -> t -> int end
为了比较,您可以使用 Pervasives.compare
如果您对min_elt
/max_elt
返回的顺序和结果没有任何要求。所以仿函数的参数可以像这样简单:
module T = struct type t = value let compare = compare end
关于set - OCaml 中的异构集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213349/