首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml中的递归集

OCaml中的递归集
EN

Stack Overflow用户
提问于 2010-07-12 01:17:57
回答 1查看 488关注 0票数 6

我如何在OCaml中定义一个也可以包含其类型的元素的Set

为了解释这个问题,我为很多数据类型做了一个类型声明,比如

代码语言:javascript
复制
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的具体模块:

代码语言:javascript
复制
module ValueSet = Set.Make(struct type t = value let compare = Pervasives.compare end)

问题是ValueSet的elt类型是value,但是value可以是ValueSet,所以我在编译它的时候遇到了麻烦。

所有这些声明都包含在一个名为types.ml的文件中(它有自己的接口types.mli,但没有任何ValueSet模块decl,因为我也不确定它是否可行)。

这个问题能以某种方式解决吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-12 05:01:22

您可以使用递归模块。Language manual使用与递归集合类型完全相同的示例来说明此语言功能。下面是相关的摘录。

递归模块定义的一个典型示例是:

模块记录A:签名类型t=字符串的叶节点。t值比较:t -> t -> int end =结构类型t=字符串的叶节点| ASet.t的节点。t让比较t1 t2 = match (t1,t2) with (叶s1,叶节点) -> Pervasives.compare s1 s2 | (Leaf _,-> _) -> 1| (Node _,Leaf _) -> -1 | (Node n1,Node n2) -> ASet.compare n1 n2 end -> ASet : Set.S,类型elt = A.t = Set.Make(A)

它可以指定如下规格:

模块记录A: sig type t=字符串的叶子| ASet的节点。t val比较:T -> t -> int end and ASet: Set.S with type elt = A.t

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3223952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档