重複の可能性:
リンクリストのパーティション関数と逆の結果
実際、私は入力タイプや出力タイプを気にしませ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、そしてcount、そしてそれからtailn回かかります...それはまだO(n)です
(C#リストがある場合は、それを逆にすることなく使用します...)
Array.ofList副次的な質問ですが、とList.toArray、またはより一般的には、A.ofBとB.ofAの違いは何List, Seq, Arrayですか?
とseq myList同じList.toSeq myListですか?
もう1つの副次的な質問は、ネストされているのは?Seq.appendと同じ複雑さです。Seq.concat
例えば
Seq.append (Seq.append (Seq.append a b) c) d // looks aweful
Seq.concat [a;b;c;d]