可能重复:
链表分区函数和相反的结果
实际上我不关心输入类型或输出类型,任何一个seq, array, list
都可以。(它不必是通用的)目前我的代码list
作为输入和(list * list)
输出
let takeWhile predicator list =
let rec takeWhileRec newList remain =
match remain with
| [] -> (newList |> List.rev, remain)
| x::xs -> if predicator x then
takeWhileRec (x::newList) xs
else
(newList |> List.rev, remain)
takeWhileRec [] list
但是,有一个陷阱。据我所知,List.rev
是 O(n^2),它可能会主导整体速度吗?我认为它甚至比丑陋的解决方案还要慢:Seq.takeWhile
, then count
, then take tail
n 次...仍然是 O(n)
(如果有一个 C# 列表,那么我会使用它而不必反转它......)
Array.ofList
一个附带问题, and List.toArray
,或更一般地说,A.ofB
and B.ofA
in之间有什么区别List, Seq, Array
?
等同seq myList
于List.toSeq myList
?
另一个问题,嵌套Seq.append
的复杂性是否与Seq.concat
?
例如
Seq.append (Seq.append (Seq.append a b) c) d // looks aweful
Seq.concat [a;b;c;d]