Set (集合)モジュール

文字列の集合を作るには:

# module SS = Set.Make(String);;
module SS : sig type elt = String.t type t = Set.Make(String).t val empty : t val is_empty : t -> bool val mem : elt -> t -> bool val add : elt -> t -> t val singleton : elt -> t val remove : elt -> t -> t val union : t -> t -> t val inter : t -> t -> t val disjoint : t -> t -> bool val diff : t -> t -> t val compare : t -> t -> int val equal : t -> t -> bool val subset : t -> t -> bool val iter : (elt -> unit) -> t -> unit val map : (elt -> elt) -> t -> t val fold : (elt -> 'a -> 'a) -> t -> 'a -> 'a val for_all : (elt -> bool) -> t -> bool val exists : (elt -> bool) -> t -> bool val filter : (elt -> bool) -> t -> t val filter_map : (elt -> elt option) -> t -> t val partition : (elt -> bool) -> t -> t * t val cardinal : t -> int val elements : t -> elt list val min_elt : t -> elt val min_elt_opt : t -> elt option val max_elt : t -> elt val max_elt_opt : t -> elt option val choose : t -> elt val choose_opt : t -> elt option val split : elt -> t -> t * bool * t val find : elt -> t -> elt val find_opt : elt -> t -> elt option val find_first : (elt -> bool) -> t -> elt val find_first_opt : (elt -> bool) -> t -> elt option val find_last : (elt -> bool) -> t -> elt val find_last_opt : (elt -> bool) -> t -> elt option val of_list : elt list -> t val to_seq_from : elt -> t -> elt Seq.t val to_seq : t -> elt Seq.t val to_rev_seq : t -> elt Seq.t val add_seq : elt Seq.t -> t -> t val of_seq : elt Seq.t -> t end

集合を作るには、どこかからはじめないといけない。 そのために空集合がある:

# let s = SS.empty;;
val s : SS.t = <abstr>

または、はじめの要素が分かっているのなら、 集合は次のように作れる:

# let s = SS.singleton "hello";;
val s : SS.t = <abstr>

この集合に要素を何個か追加するにはこうすればよい:

# let s =
    List.fold_right SS.add ["hello"; "world"; "community"; "manager";
                            "stuff"; "blue"; "green"] s;;
val s : SS.t = <abstr>

ここで、集合をいじっていると、 作った集合のなかに何があるかを見たいと思うことだろう。 そのために、 集合を表示する関数を次のように書ける。

# (* Prints a new line "\n" after each string is printed *)
  let print_set s = 
     SS.iter print_endline s;;
val print_set : SS.t -> unit = <fun>

集合の中のある特定の要素を削除したいときには削除関数がある (訳注:SS.remove "hello" s;;)。 しかし、同時に何個かの要素を削除したいときには、 「フィルタ」を通すようなものを考える。 5文字以下の単語をすべてフィルタリングしよう。

このように書ける:

# let my_filter str =
    String.length str <= 5;;
val my_filter : string -> bool = <fun> # let s2 = SS.filter my_filter s;;
val s2 : SS.t = <abstr>

あるいは匿名関数を使って:

# let s2 = SS.filter (fun str -> String.length str <= 5) s;;
val s2 : SS.t = <abstr>

集合内にある要素が存在するかどうかを調べたいときは このようになるだろう:

# SS.mem "hello" s2;;
- : bool = true

Set モジュールはまた、 集合理論の操作、和集合、積集合、差集合を提供する。 例えば、元の集合と短い文字列集合(5文字以下)の集合の差集合は、 長い文字列集合である:

# print_set (SS.diff s s2);;
community manager - : unit = ()

Set モジュールは純粋に関数的データ構造を提供することに注意: 集合から要素を取り除くのは集合が変更されるのではなくむしろ、 元の集合とほとんど同じ(内部的には多くを共有する)新しい集合が返される。