如何将列表列表变成单个列表 F#

How to make a list of lists into single list F#

我有一个列表列表

LL = [[1;2;3];[4;5;6];[7;8;9]]

我希望它看起来像这样

LSimple= [1;2;3;4;5;6;7;8;9]

我想问的就这么简单,但也许重新措辞会有所帮助。我如何解析这个列表列表并从中创建一个简单列表?

List.concat LL 

会做你想做的。 X.concat 系列函数将集合 X 的任何序列连接到单个 X,其中 X 可以是 ListArraySeq 甚至 String使用给定的分隔符。

根据 List.concat 的实施情况,它可能非常低效。如果它是用朴素的方法实现的,它将使用朴素的方式进行单个附加。 对于简单的情况:假设我们有两个列表 xs ys 我们希望附加在一起。

那么实施就是

let rec append =
    function
    | [], ys -> ys
    | xs, [] -> xs
    | x::xs, y::ys -> append(x :: append (xs,[y]), ys)

这是最低效的实现,另一个实现将简单地将最后一个案例 return 替换为

x::append(xs,y::ys)

两者都有 O(n) 运行宁时间。但最后一个将有一个较小的 konstant k (k*n)。

下面给出了 2*k*n 运行 时间的最有效方法。其中 n 是元素的数量,k 是将单个元素连接到列表的成本。

let collapse lst =
   let rec help acc =
      function
      | [] -> // conversion point
         List.rev acc
      | (x :: []) :: xss -> // singleton case
         help (x :: acc) xss
      | (x :: xs) :: xss -> // general case
         help (x :: acc) (xs :: xss)
   help [] lst // return 

总的来说,在效率方面不要相信图书馆,要知道制作它们的人和你一样都是人,所以可能会有很多错误。