Sets

Module Set

To make a set of strings:

# module SS = Set.Make(String);;
module SS :
  sig
    type elt = string
    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

To create a set you need to start somewhere so here is the empty set:

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

Alternatively if we know an element to start with we can create a set like

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

To add some elements to the set we can do.

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

Now if we are playing around with sets we will probably want to see what is in the set that we have created. To do this we can write a function that will print the set out.

# let print_set s = 
   SS.iter print_endline s;;
val print_set : SS.t -> unit = <fun>

If we want to remove a specific element of a set there is a remove function. However if we want to remove several elements at once we could think of it as doing a 'filter'. Let's filter out all words that are longer than 5 characters.

This can be written as:

# 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>

or using an anonymous function:

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

If we want to check and see if an element is in the set it might look like this.

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

The Set module also provides the set theoretic operations union, intersection and difference. For example, the difference of the original set and the set with short strings (≤ 5 characters) is the set of long strings:

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

Note that the Set module provides a purely functional data structure: removing an element from a set does not alter that set but, rather, returns a new set that is very similar to (and shares much of its internals with) the original set.

Help Improve Our Documentation

All OCaml docs are open source. See something that's wrong or unclear? Submit a pull request.

Contribute