| [x] | 1.01.p | --- Program | 002 | -- | -- | 2018-04-16 | ---------- |
| [x] | 1.01.p.1 | ---- interpreter: maxargs | --- | -- | -- | 2018-04-17 | 2018-04-17 |
| [x] | 1.01.p.2 | ---- interpreter: interp | --- | -- | -- | 2018-04-17 | 2018-04-17 |
-| [ ] | 1.01.e | --- Exercises | 002 | -- | -- | ---------- | ---------- |
-| [ ] | 1.01.e.1.a | ---- tree member | --- | -- | -- | ---------- | ---------- |
+| [-] | 1.01.e | --- Exercises | 002 | -- | -- | ---------- | ---------- |
+| [x] | 1.01.e.1.a | ---- tree member | --- | -- | -- | ---------- | ---------- |
| [ ] | 1.01.e.1.b | ---- tree key/val | --- | -- | -- | ---------- | ---------- |
| [ ] | 1.01.e.1.c | ---- demo unbalanced behaviour | --- | -- | -- | ---------- | ---------- |
| [ ] | 1.01.e.1.d | ---- find functional balanced tree | --- | -- | -- | ---------- | ---------- |
--- /dev/null
+module Array = ArrayLabels
+
+module type TREE = sig
+ type 'a t
+
+ val empty : 'a t
+
+ val add : 'a t -> 'a -> 'a t
+
+ val member : 'a t -> 'a -> bool
+end
+
+module BinaryTree : TREE = struct
+ type 'a t =
+ | Node of 'a * 'a t * 'a t
+ | Leaf
+
+ let empty = Leaf
+
+ let rec add t x =
+ match t with
+ | Leaf -> Node (x, Leaf, Leaf)
+ | Node (x', left, right) when x < x' -> Node (x', add left x, right)
+ | Node (x', left, right) when x > x' -> Node (x', left, add right x)
+ | (Node _) as t' -> t'
+
+ let rec member t x =
+ match t with
+ | Leaf -> false
+ | Node (x', left, _) when x < x' -> member left x
+ | Node (x', _, right) when x > x' -> member right x
+ | Node _ -> true
+end
+
+let () =
+ let tree =
+ Array.fold_left
+ (Sys.argv)
+ ~init:BinaryTree.empty
+ ~f:(fun t str -> BinaryTree.add t str)
+ in
+ Printf.printf "%B\n" (BinaryTree.member tree "a")