транспонирование списка списков

Я пытаюсь сделать рекурсивную функцию, чтобы получить транспонирование списка списков,n x p to p x n. Но я не могу этого сделать. Я смог сделать функцию для транспонирования 3 x n список списков на n x 3 первый:

let rec drop1 list=
    [(match (List.nth list 0) with [] -> [] | a::b -> b);
     (match (List.nth list 1) with [] -> [] | a::b -> b);
     (match (List.nth list 2) with [] -> [] | a::b -> b);]

let rec transpose list=
    if List.length (List.nth list 0) == 0 then []
    else [(match (List.nth list 0) with [] -> 0 | a::b -> a);
          (match (List.nth list 1) with [] -> 0 | a::b -> a);
          (match (List.nth list 2) with [] -> 0 | a::b -> a)]
         :: transpose (drop1 list)

но я не могу обобщить его. Я, конечно, думаю не в том направлении. Это обобщать? Есть ли лучшее решение? Пожалуйста помочь.

1 ответов


let rec transpose list = match list with
| []             -> []
| []   :: xss    -> transpose xss
| (x::xs) :: xss ->
    (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss)