可能重复:
链表分区函数和相反的结果
实际上我不关心输入类型或输出类型,任何一个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 tailn 次...仍然是 O(n)
(如果有一个 C# 列表,那么我会使用它而不必反转它......)
Array.ofList一个附带问题, and List.toArray,或更一般地说,A.ofBand B.ofAin之间有什么区别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]