Ваш второй подход идет в правильном направлении - ваша функция firstColumn
правильно создает первый столбец, а ваша dropFirstColumn
дает вам данные для оставшихся строк вашей матрицы.
Все, чего не хватаетв том, что вам нужно соединить эти два элемента и вызывать их рекурсивно, пока вложенные списки в вашем основном списке не станут пустыми.Один из способов сделать это (который работает, но не очень хорошо обрабатывает некорректные входные данные) будет выглядеть следующим образом:
let firstColumn (lst : 'a list list): 'a list =
List.map List.head lst
let dropFirstColumn (lst : 'a list list): 'a list list =
List.map List.tail lst
let rec transpose list =
if List.isEmpty (List.head list) then [] else
firstColumn list ::
transpose (dropFirstColumn list)
Условие в if
проверяет, является ли первый вложенный список пустым- при условии, что они все имеют одинаковую длину, это означает, что мы дошли до конца списка, и мы просто возвращаем пустой список.Если это не так, мы обрабатываем первый столбец, используя firstColumn list
, рекурсивно обрабатываем оставшиеся столбцы, используя transpose (dropFirstColumn list)
, а затем соединяем два, используя ::
.
. Вы можете даже встроить две свои вспомогательные функции инапишите только это:
let rec transpose list =
if List.isEmpty (List.head list) then [] else
List.map List.head list ::
transpose (List.map List.tail list)