2010-07-11 78 views
4

我如何設法在OCaml中定義一個Set,它可以包含其類型的元素?在OCaml中遞歸設置

要解釋,我有一個像

type value = 
    Nil 
| Int of int 
| Float of float 
| Complex of Complex.t 
| String of string 
| Regexp of regexp 
| Char of char 
| Bool of bool 
| Range of (int*int) list 
| Tuple of value array 
| Lambda of code 
| Set of ValueSet.t (* this isn't allowed in my case since module is declared later*) 

另外進行了大量的數據類型的類型聲明的問題,我宣佈一個具體的模塊ValueSet在同一個文件後:

module ValueSet = Set.Make(struct type t = value let compare = Pervasives.compare end) 

的問題是,ValueSetvalue,因爲它是elt類型,但value可以是ValueSet,所以我在嘗試編譯時遇到麻煩。

所有這些聲明都包含在一個名爲types.ml的文件中(它有自己的接口types.mli,但沒有任何ValueSet模塊decl,因爲我不確定它是可能的)。

這個問題能以某種方式解決嗎?

回答

5

您可以使用遞歸模塊。 Language manual完全使用遞歸集類型的相同示例來說明此語言功能。

+0

看來我的OCaml編譯器(3.11.0)還不支持它們。無論如何,在types.ml文件中有這樣的遞歸聲明會強制使用像Types.InnerTypes和Types.ValueSet這樣的內部模塊,對於ValueSet可以正常使用,但對其他模塊不可以。 – Jack 2010-07-11 22:03:48

+0

I認爲我正在慢慢地管理它,以便以某種方式工作..如果我能夠使其工作,我很可能會在短時間內接受您的答案:) – Jack 2010-07-11 22:43:05

+0

OCaml自3.07版本以來已有遞歸模塊。 – Gilles 2010-07-16 21:08:37