异构的OCaml中
假设我有定义为异构的OCaml中
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
仿函数中使用吗?
那么当然我需要能够给这些值的完整排序所以我应该发明的东西就像给预定为不同的类型,然后通过他们的有效价值,命令他们..是吗?
因此,例如,我可以决定如果x < y
有Int of int < Float of int
和Int x < Int 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
但将这种允许int和float的浮动的诠释之间的比较(我认为这是什么OP是问,虽然他写道: 诠释INT
问题是我需要提供一种方法来订购不同类型的数据类型以便能够使用Set,这就是为什么我想知道是否强制一个特定的层次结构(例如'None
@Jack'Pervasives.compare'会自动进行明智的比较;我相信它会实现你自己提出的层次结构。除非您有特殊需求,否则无需定义您自己的比较功能。 – 2010-07-10 02:34:38
你的意思是你想要比较:int的int
aneccodeal
2010-07-09 20:50:04