2010-07-09 36 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