let transpose l =
let get_nths i l = List.map (fun x->List.nth x i) l in
match l with
| [] -> []
| x::l' ->
begin
let n = (List.length x) in match List.for_all (fun y -> n = List.length y) l' with
| false -> raise (Invalid_argument "transpose")
| true -> List.map (fun j->get_nths j l) (range 0 (n-1))
end