2016-06-21 65 views
3

我想写一个函数,给定一个非负整数n,返回{1,...,n}的幂集。所以我想用SetS模块找到here。但我似乎无法导入它。当我运行下面的代码:如何在OCaml中使用套件?

open Set.S 

let rec power_set n = 
    if n = 0 then add empty empty else union (iter (add n s) power_set (n-1)) (power_set (n-1));; 

let print_set s = SS.iter print_endline s;; 

print_set (power_set 2) 

我得到的错误:

File "countTopologies.ml", line 1, characters 5-10: 
Error: Unbound module Set.S 

也许我只是没有安装在我的电脑上Set.S模块? (我只做了安装OCaml所需的裸骨头)。如果是这样的话,我将如何得到它?

+0

相关:http://stackoverflow.com/questions/1452218/ocaml-set - 模块 –

回答

6

Set.S模块类型不是一个模块。您只能打开模块。事实上模块Set包含三个元素:

  • 模块类型OrderedType其是一种类型的模块的实现有序类型;
  • 模块类型S这是一种实现Set数据结构的模块;
  • 仿函数Make需要一个OrderedType类型的模块并返回一个S类型的模块。

例如,创建一个模块,实现了整数一组,你可以做到以下几点:

module Int = struct 
    type t = int 
    (* use Pervasives compare *) 
    let compare = compare 
end 

module Ints = Set.Make(Int) 

其他的库,例如Janestreet的核心库,提供套在箱子外面,例如,核心库中有一个已被控集,映射,哈希表的Int模块,所以它无需任何函子来访问:

open Core.Std 

let nil = Int.Set.empty 
3

你必须Make来自Set函子的一个集合模块。

module SI = Set.Make(struct type t = int let compare = compare end) 

然后你就可以有一组整数的:

# let myset = SI.add 3 SI.empty;; 
val myset : SI.t = <abstr> 
# SI.elements myset;; 
- : SI.elt list = [3]