@@ -14,7 +14,16 @@ type coin = unit -> bool
1414(* * Väärtustab avaldise etteantud mündiga.
1515 NB! Väärtustamise järjekord on oluline. *)
1616let rec eval (coin : coin ) (e : t ): int =
17- failwith " TODO"
17+ match e with
18+ | Num i -> i
19+ | Neg e -> - (eval coin e)
20+ (* | Add (e1, e2) -> eval coin e2 + eval coin e1 *)
21+ | Add (e1 , e2 ) ->
22+ let i1 = eval coin e1 in
23+ let i2 = eval coin e2 in
24+ i1 + i2
25+ (* | Flip (e1, e2) -> if coin () then eval coin e1 else eval coin e2 *)
26+ | Flip (e1 , e2 ) -> eval coin (if coin () then e1 else e2)
1827
1928
2029(* * Konstrueerib kahe listi otsekorrutise. *)
@@ -31,7 +40,13 @@ let cartesian_map (f: 'a -> 'b -> 'c) (l1: 'a list) (l2: 'b list): 'c list =
3140 Vihje: List.map.
3241 Vihje: cartesian_product või cartesian_map. *)
3342let rec eval_list (e : t ): int list =
34- failwith " TODO"
43+ match e with
44+ | Num i -> [i]
45+ | Neg e -> List. map (fun x -> - x) (eval_list e)
46+ (* | Add (e1, e2) -> List.map (fun (x, y) -> x + y) (cartesian_product (eval_list e1) (eval_list e2)) *)
47+ (* | Add (e1, e2) -> cartesian_map (fun x y -> x + y) (eval_list e1) (eval_list e2) *)
48+ | Add (e1 , e2 ) -> cartesian_map (+ ) (eval_list e1) (eval_list e2)
49+ | Flip (e1 , e2 ) -> eval_list e1 @ eval_list e2
3550
3651
3752module IntSet =
5368 Vihje: IntSet.map.
5469 Vihje: IntSet.cartesian_map. *)
5570let rec eval_set (e : t ): IntSet.t =
56- failwith " TODO"
71+ (* IntSet.of_list (eval_list e) *)
72+ match e with
73+ | Num i -> IntSet. singleton i
74+ | Neg e -> IntSet. map (fun x -> - x) (eval_set e)
75+ | Add (e1 , e2 ) -> IntSet. cartesian_map (+ ) (eval_set e1) (eval_set e2)
76+ | Flip (e1 , e2 ) -> IntSet. union (eval_set e1) (eval_set e2)
0 commit comments