(* Scrieți o funcție care ia două dicționare reprezentând funcțiile f1 și f2
 * și returnează dicționarul care reprezintă f2 compus cu f1 *)

module M = Map.Make(String)

(* Vom parcurge dicționarul m1 , adică funcția care se aplică intâi
 * Rezultatul pornește de la dicționarul vid
 * deci structura e următoarea:
 * let compose m1 m2 = M.fold (fun k1 v1 r -> ... ) m1 M.empty   *)

(* Funcția f2 se aplică la rezultatul lui f1, adică la valoarea v1
 * Trebuie să vedem dacă dicționarul m2 conține cheia v1
 * Am putea verifica M.mem v1 m2 dar asta ar însemna două căutări în m2,
 * prima pentru a verifica, a doua pentru a obține valoarea
 * Rolul excepțiilor e tocmai de a evita acest lucru. *)

(* Dacă în mod normal am folosi M.find v1 m2 într-o expresie 
 *    expresie ( M.find v1 m2 )
 * cum știm că s-ar putea genera excepția Not_found, scriem în loc:
 *  try   expresie ( M.find v1 m2 )
 *  with Not_found -> valoarea dorită a expresiei în acest caz   *)

let compose m1 m2 = M.fold (fun k1 v1 r ->
  try M.add k1 (M.find v1 m2) r                (* la r adaugăm perechea (k1, f2 v1)
                                         * adică k1 ---> f2 (f1 (k1)) *)
  with Not_found -> r) m1 M.empty        (* altfel continuăm cu același r *)
   
let dict1 = M.add "a" "b" (M.add "b" "c" (M.singleton "d" "e"))
let dict2 = M.add "e" "2" (M.add "f" "3" (M.singleton "b" "1"))
let rez = compose dict1 dict2
;;
M.bindings rez;;
(* a --> b --> 1
   b --> c --> nimic in dict2
   d --> e --> 2
   nimic nu ajunge in f ---> 3 *)

   

This document was generated using caml2html