换句话说,取每个子列表的第一项并将其放入一个新列表中,取每个子列表的第二项并将其放入一个新列表等,然后返回所有这些新列表的列表。
示例:如果输入是:
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
以上代码的唯一优点是它是rail递归的(至少我认为是这样)。
也许有什么
List.unfold
?