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