2016-06-21 3 views
3

Я хочу написать функцию, которая, заданная неотрицательным целым числом n, возвращает набор мощности {1, ..., n}. Поэтому я хочу использовать модуль Set.S, как найдено 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;
  • functor Make, который принимает модуль типа OrderedType и возвращает модуль типа S.

Например, чтобы создать модуль, который реализует набор для целых чисел, вы можете сделать следующее:

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

module Ints = Set.Make(Int) 

Других библиотек, как библиотеки ядра Janestreet, представят наборы из коробки, например, , Core библиотека имеет 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] 
Смежные вопросы