如何在OCaml中使用集合?

Noa*_*ton 5 ocaml module

我想编写一个函数,给定一个非负整数n,返回{1,...,n}的幂集.所以我想使用这里找到的Set.S模块.但我似乎无法导入它.当我运行以下代码时:

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)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

File "countTopologies.ml", line 1, characters 5-10:
Error: Unbound module Set.S
Run Code Online (Sandbox Code Playgroud)

也许我只是没有在我的电脑上安装Set.S模块?(我只完成了安装OCaml所需的裸骨).如果是这种情况,我该怎么做?

ivg*_*ivg 8

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)
Run Code Online (Sandbox Code Playgroud)

其他库,如Janestreet的核心库,提供了开箱即用的功能,例如,Core库有一个Int模块,已经充满了集合,地图,哈希表,所以它可以在没有任何仿函数的情况下访问:

open Core.Std

let nil = Int.Set.empty
Run Code Online (Sandbox Code Playgroud)