リストには実際には値が含まれており、シーケンスはのエイリアスであることを理解していますIEnumerable<T>。実際のF#開発では、リストではなくシーケンスをいつ使用する必要がありますか?
シーケンスがいつより良くなるかを私が見ることができるいくつかの理由はここにあります:
- を必要とする他の.NET言語またはライブラリと対話する場合
IEnumerable<T>。 - 無限のシーケンスを表す必要があります(おそらく実際にはあまり役に立ちません)。
- 遅延評価が必要です。
他にありますか?
seqそのように生成されたものは、見るたびに異なる乱数を生成することに注意してください。これは明らかに非決定的なバグ...の源となり得る
回答:
いつ選ぶべきかについてのあなたの要約Seqはかなり良いと思います。ここにいくつかの追加のポイントがあります:
Seq関数を作成するときにデフォルトで使用します。これは、関数が任意の.NETコレクションで機能するためです。Seqような高度な機能が必要な場合に使用しますSeq.windowedSeq.pairwiseSeqデフォルトで選択するのが最善のオプションだと思いますが、いつ別のタイプを選択しますか?
使用Listあなたが使用して再帰的な処理を必要とするhead::tailパターンを
(標準ライブラリでは利用できないいくつかの機能を実装するために)
Listステップバイステップで構築できる単純な不変のデータ構造が必要な場合に使用します
(たとえば、あるスレッドでリストを処理する必要がある場合(統計を表示するため)、同時に別のスレッドでリストを作成し続ける必要がある場合)より多くの値、つまりネットワークサービスから)
List短いリストで作業するときに使用します-リストは、値が空のリストを表すことが多い場合に使用するのに最適なデータ構造です。そのシナリオでは非常に効率的だからです
Array値型の大規模なコレクションが必要な場合に使用します
(配列はフラットメモリブロックにデータを格納するため、この場合はメモリ効率が高くなります)
Arrayランダムアクセスまたはより高いパフォーマンス(およびキャッシュの局所性)が必要な場合に使用します
List単純な不変のデータ構造が必要な場合は[...]を使用し、同時に別のスレッドでリストの構築を続行します[...]」詳細を教えてください。ここでの意味/それはどのように機能しますか?ありがとう。
x::xs、繰り返しの過程にある可能性のある既存のワーカーを壊すことなく、を使用して新しいリストを作成できるということですxs
次のseq場合も優先します。
すべての要素を同時にメモリに保持する必要はありません。
パフォーマンスは重要ではありません。
列挙の前後に何かを行う必要があります。たとえば、データベースに接続して接続を閉じます。
連結していません(繰り返されるSeq.appendとスタックオーバーフローが発生します)。
次のlist場合に優先します。
いくつかの要素があります。
あなたはたくさんの前置きと斬首をするでしょう。
どちらseqもlist並列処理には適していませんが、必ずしもそれらが悪いことを意味するわけではありません。たとえば、どちらかを使用して、並行して実行される個別の作業項目の小さな束を表すことができます。
ほんの1つの小さなポイント:Seqそして並列処理Arrayよりも優れListています。
F#PowerPackのPSeq、Array.Parallelモジュール、Async.Parallel(非同期計算)のいくつかのオプションがあります。リストは、そのシーケンシャルな性質(head::tail構成)のため、並列実行にはひどいです。
ArrayかPSeq、はるかに優れていることに同意します。
seqがlist並列処理よりも優れていると言うのですか?seqシーケンシャルな性質のため、並列実行にもひどいです...
常にSeqパブリックAPIで公開する必要があります。ListとArrayを内部実装で使用します。
SeqはIEnumerable<T>?
seq並列処理に非常に悪いという理由もあり、一般的に同意します。