2010-07-09 37 views
3

假设我有定义为异构的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 < yInt of int < Float of intInt x < Int y。这是我想要实现的一种实用方法吗?

+0

你的意思是你想要比较:int的int aneccodeal 2010-07-09 20:50:04

回答

7

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 
+0

但将这种允许int和float的浮动的诠释之间的比较(我认为这是什么OP是问,虽然他写道: 诠释INT aneccodeal 2010-07-09 20:49:11

+0

问题是我需要提供一种方法来订购不同类型的数据类型以便能够使用Set,这就是为什么我想知道是否强制一个特定的层次结构(例如'None Jack 2010-07-10 00:26:56

+1

@Jack'Pervasives.compare'会自动进行明智的比较;我相信它会实现你自己提出的层次结构。除非您有特殊需求,否则无需定义您自己的比较功能。 – 2010-07-10 02:34:38