(* 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