(* un modul parametrizat, la fel ca modulul standard Set * are în plus o funcție care creează o mulțime dintr-o listă *) module LstSet (Elt: Set.OrderedType) = (* Elt = modulul pentru elemente *) struct include Set.Make(Elt) (* include conținutul modulului set *) (* creează mulțime din listă * adaugă elemente la mulțimea vidă *) let set_of_list = List.fold_left (fun r e -> add e r) empty end (* modul parametrizat cu două module pentru cele două tipuri de elemente *) module CartSet (Elt1: Set.OrderedType) (Elt2: Set.OrderedType) = struct module S1 = LstSet(Elt1) (* modul pentru multimea de primul tip *) module S2 = LstSet(Elt2) (* modul pentru multimea de al doilea tip *) (* modul cu tipul perechilor dintre tipul 1 și tipul 2 * e definit tipul elementelor: tip pereche * si funcția de comparare -- se preia cea standard * include modulul, odată ce e definit *) include LstSet(struct type t = S1.elt * S2.elt let compare = compare end) let cartprod s1 s2 = (* mulțime de perechi între un element din s1 și b * e1 parcurge multimea s1; se adaugă perechea (e1, b) la acumulator *) let appendpairs s1 b = S1.fold (fun e1 -> add (e1, b)) s1 (* parcurge mulțimea 2, creează perechi cu toate elementele din s1 *) in S2.fold (appendpairs s1) s2 empty end module CS = CartSet(struct type t = int let compare = compare end)(Char) ;; (* face produsul cartezian * apoi transformă în listă pentru vizualizare în interpretor *) CS.elements (CS.cartprod (CS.S1.set_of_list [1;2;3]) (CS.S2.set_of_list ['a';'b']));;
This document was generated using caml2html