type 'a alist = (string * 'a) list;; let rec zip list1 list2 = match (list1,list2) with | ([],_) -> [] | (_,[]) -> [] | (x::xs,y::ys) -> (x,y) :: zip xs ys;; let make_alist list1 (list2:('a list)) : ('a alist) = zip list1 list2;; let l1 = ["Jim";"Steve";"Anne";"James";"Rachel"];; let l2 = [21;32;22;19;20];; let l3 = ["English";"Math";"Computer Science";"Biology";"Physics"];; let a1 = make_alist l1 l2;; let a2 = make_alist l1 l3;; let rec lookup_alist key list = match list with | [] -> None | (k,v)::vs -> if key = k then Some v else lookup_alist key vs;; lookup_alist "Mark" a1;; lookup_alist "James" a1;; lookup_alist "Rachel" a2;; let print_major name alist = let result = lookup_alist name alist in match result with | None -> print_string "No record found!" | Some s -> print_string (name ^ "'s major is " ^ s);; print_major "Mark" a2;; print_major "Anne" a2;;