2010-07-11 79 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