【发布时间】:2019-10-03 12:19:14
【问题描述】:
我想在 F# 中转置一个嵌套列表 ('a list list)。问题是,我不想使用递归。
但是,我发现为了不使用递归,我必须使用可变列表。在我看来,这有点问题。尽管如此,我还是尝试用一个 for 循环和两个可变列表来实现它:
let transpose (llst : 'a list list) : 'a list list =
let mutable lst = llst
let mutable result = [List.map List.head lst]
for i = 1 to lst.Length do
lst <- List.map List.tail lst
result <- List.append result [List.map List.head lst]
result
此外,我已经尝试避免它。我知道数组的可变性,所以我尝试通过将'a list list 转换为 2darray ([,]) 来解决问题,但是,当尝试将结果转换回嵌套列表时,它失败了,因为List.ofArray仅适用于一维数组:
let transpose (llst : 'a list list) : 'a list list = [List.ofArray (Array2D.init (llst.ToArray.GetLength 1) (llst.ToArray.GetLength 0) (fun x y -> llst.ToArray.[y,x]))]
第一个代码有效,但我想要一个更简单的实现,没有 for 循环或可变列表。
第二个代码不起作用,因为函数List.ofArray 仅适用于[],不适用于[,]。
我也试过
List.init (llst.[0].Length) (List.forall (fun SOMETHING) llst)
SOMETHING 将包含一个函数,该函数获取两个子列表的第一列,然后删除第一列。 (List.map List.head 和 List.map List.tail)。也许使用List.map?
【问题讨论】: