2016-06-21 66 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]