У меня есть список списков, где каждый внутренний список имеет одинаковую длину, и мне нужно спроецировать его как обратное (то есть мне нужно, чтобы измерения были перевернуты).
Другими словами, взятьпервый элемент каждого подсписка и поместите его в новый список, возьмите второй элемент каждого подсписка и поместите его в новый список и т. д. Затем верните список всех этих новых списков.
Пример: если вводis:
let ls = [[1;2;3];[4;5;6];[7;8;9];[0;0;0]];;
Тогда вывод должен быть:
val it : int list list = [[1; 4; 7; 0]; [2; 5; 8; 0]; [3; 6; 9; 0]]
У меня есть рабочий код, но он не выглядит правильным.Он проходит несколько раз по спискам, должен выполнить List.rev
несколько раз и должен проверять наличие пустых значений во внутренних списках:
let rec getInnerHeads acc skipped lst =
match lst with
| [] -> List.rev acc, List.rev skipped
| item::rest ->
match item with
| [] -> [], skipped
| innerHead::skip1 ->
getInnerHeads (innerHead::acc) (skip1::skipped) rest
let rec flipDimensions acc lst =
match lst with
| [] -> acc |> List.rev
| z when (z |> List.forall List.isEmpty) -> acc |> List.rev
| rest ->
let (elem, skip1Elems) = getInnerHeads [] [] rest
flipDimensions (elem::acc) skip1Elems
Единственным преимуществом приведенного выше кода является то, что он является рекурсивным по рельсам(по крайней мере, я так думаю).
У кого-нибудь есть более эффективный, сжатый или оба алгоритма?Я проверил F # Snippets и SO, подумал, что об этом уже спрашивали, это кажется очень распространенным, но я не нашел никаких примеров.
Может быть, что-то с List.unfold
?