Objective Caml version 3.08.4 # let tuple = 1, 2.0, "three";; val tuple : int * float * string = (1, 2., "three") # let add1 (a, b, c) = a + 1, b +. 1.0, c ^ " one";; val add1 : int * float * string -> int * float * string = # add1 tuple;; - : int * float * string = (2, 3., "three one") # let add1' tup = match tup with a, b, c -> a + 1, b +. 1.0, c ^ " one";; val add1' : int * float * string -> int * float * string = # add1' tuple;; - : int * float * string = (2, 3., "three one") # let rec combine3 l1 l2 l3 = match l1, l2, l3 with [], [], [] -> [] | hd1 :: tl1, hd2 :: tl2, hd3 :: tl3 -> (hd1, hd2, hd3) :: (combine3 tl1 tl2 tl3);; Warning: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: (_::_, [], _) val combine3 : 'a list -> 'b list -> 'c list -> ('a * 'b * 'c) list = # let rec combine3 l1 l2 l3 = match l1, l2, l3 with [], [], [] -> [] | hd1 :: tl1, hd2 :: tl2, hd3 :: tl3 -> (hd1, hd2, hd3) :: (combine3 tl1 tl2 tl3) | _ -> raise (Invalid_argument "Lists have different lengths");; val combine3 : 'a list -> 'b list -> 'c list -> ('a * 'b * 'c) list =