(* ---------- exA ---------- *) type 'a matrix = 'a list list ;; let rec count b m = match m with | [] -> 0 | []::xs -> 0 + count b xs | (v::vs)::xs -> (if (v = b) then 1 else 0) + count b [vs] + count b xs ;; count 4 [[1; 2; 3]; [4; 5; 1]] ;; count 1 [[1; 2; 3]; [4; 5; 1]] ;; (* ---------- exB ---------- *) let rec first m = match m with | [] -> [] | []::xs -> first xs | [v::vs] -> [v] | (v::vs)::xs -> v :: first xs ;; first [[1; 2; 3]] ;; first [[1; 2; 3]; [4; 5; 1]] ;; first [[1; 0; 0]; [2; 0; 0]; [3; 0; 0]; [4; 0; 0]] ;; (* ---------- exC ---------- *) let rec rest m = match m with | [] -> [] | []::xs -> rest xs | [v::vs] -> [vs] | (v::vs)::xs -> vs :: rest xs ;; rest [[1; 2; 3]] ;; rest [[3]; [4; 6; 6]] ;; rest [[1; 2; 3]; [4; 5; 1]] ;; rest [[1; 0; 0]; [2; 0; 0]; [3; 0; 0]; [4; 0; 0]] ;; (* ---------- exD ---------- *) let rec returnEl n l = match l with | [] -> [] | el::xl -> if (n=0) then [el] else returnEl (n-1) xl ;; returnEl 0 [1; 2; 3; 4] ;; returnEl 1 [1; 2; 3; 4] ;; returnEl 2 [1; 2; 3; 4] ;; let rec diag m = match m with | [] -> [] | []::xm -> [] | [el::xm] -> [el] | (el::xl)::xm -> el::(diag (rest xm)) ;; diag [[1; 2; 3]; [4; 5; 1]] ;; diag [[1; 0; 0]; [0; 2; 0]; [0; 0; 3]; [4; 5; 6]] ;; (* ---------- exE ---------- *) let rec trans m = match rest m with | [] -> [] | _ -> first m :: trans (rest m) ;; trans [[1; 2; 3]; [4; 5; 1]] ;; trans [[1; 0; 0]; [0; 2; 0]; [0; 0; 3]; [4; 5; 6]] ;; (* ---------- exF ---------- *)