リストのサブセクションを取得するための推奨される方法は何ですか?また、GetSliceをサポートするように構築されていないのはなぜですか?
最後の質問を最初に、最初の質問を最後にしましょう。
リストがGetSliceをサポートしない理由
リストはリンクリストとして実装されているため、インデックスに効率的にアクセスすることはできません。比較的言えば、配列には時間がかかり、同等の構文はリストに時間がかかりfoo.[|m..n|]
ます。これはかなり大きな問題です。なぜなら、それが役立つ場合のほとんどの場合、スライス構文を効率的に使用することができないからです。O(n-m)
O(n)
たとえば、線形時間で配列を同じサイズの断片に分割できます。
let foo = [|1 .. 100|]
let size = 4
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |]
しかし、代わりにリストを使用していた場合はどうなりますか?を呼び出すたびにfoo.[a..a+size]
時間がかかり、操作全体が長くなり、O(n^2)
仕事にはかなり不向きになります。
ほとんどの場合、リストをスライスすることは間違ったアプローチです。通常、パターンマッチングを使用して、リストをトラバースおよび操作します。
リストをスライスするための好ましい方法は?
可能な限り、パターンマッチングを使用してください。それ以外の場合は、フォールバックしてリストとシーケンスを切り取ることSeq.skip
ができます。Seq.take
> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]