(* modul pentru multimi de tip string sau char putem crea direct *)
module S = Set.Make(String)

(* multimi mici formam direct cu elementele *)
let m1 = S.add "ana" (S.add "are" (S.singleton "mere"))
;;
(* putem afla cardinalul multimii *)
S.cardinal m1
;;
(* testam daca un element e in multime *)
S.mem "ana" m1;;
S.mem "lia" m1;;
(* cream alta multime *)
let m2 = S.add "si" (S.singleton "rosii")
;;
(* facem reuniunea *)
S.union m1 m2
;;
(* multimea nu e afisata direct de interpretor *)
(* obtinem lista elementelor *)
S.elements m2;;
S.elements m1;;
(* sunt la fel ca inainte, reuniunea nu le modifica, ci creează altă mulțime *)
S.elements (S.union m1 m2);;
(* sau putem sa o parcurgem tiparind elementele *)
open Printf
let print_strset s = print_char '{'; S.iter (printf " %s") s; print_endline " }"
;;
print_strset m1;;
(* putem calcula o valoare din toate elementele *)
(* functia pentru fold are doi parametri, elementul si rezultatul partial *)
let lungtot s = S.fold (fun e acc -> (String.length e) + acc) s 0
;;
lungtot m1;;
(* putem selecta anumite elemente *)
let m3 = S.filter (fun e -> String.length e = 3) m1
;;
S.elements m3;;
(* cineva a vrut sa facem din multime mai multe multimi cu cate un element
 * le punem intr-o lista *)
let sglist m = S.fold (fun e acc -> S.singleton e :: acc) m []
;;
let l1 = sglist m1;;
(* e o lista de multimi, interpretorul nu afiseaza elementele *)
(* putem verifica faptul ca toate multimile au un element *)
List.for_all (fun e -> S.cardinal e = 1) l1;;
(* putem parcurge lista si tipari un element (singurul) din multime *)
List.iter (fun e -> printf "%s " (S.choose e)) l1;;
(* S.fold a parcurs multimea si a adaugat elementele in ordine,
 * deci primul a ajuns la coada listei l1 *)

(* o alta multime cu aceleasi trei siruri *)
let m0 = S.add "ana" (S.add "mere" (S.singleton "are"));;
if m0 <> m1 then print_endline "NU folositi = pentru a compara multimi!!!";;
(* multimile NU se compara cu =, poate sa difere reprezentarea interna
   in functie de ordinea de adaugare a elementelor *)
if S.equal m1 m0 then print_endline "folositi S.equal: totusi ele sunt egale";;
(* trebuie sa le comparam cu S.equal *)

This document was generated using caml2html