89

リストには実際に値が含まれており、シーケンスは のエイリアスであることを理解していますIEnumerable<T>。実際の F# 開発では、リストではなくシーケンスを使用する必要があるのはどのような場合ですか?

シーケンスがより良い場合に私が見ることができるいくつかの理由を次に示します。

  • を必要とする他の .NET 言語またはライブラリと対話する場合 IEnumerable<T>
  • 無限のシーケンスを表す必要があります (おそらく実際にはあまり役に立ちません)。
  • 遅延評価が必要です。

他にもありますか?

4

5 に答える 5

105

Seqいつ選択するかについてのあなたの要約はかなり良いと思います。追加のポイントを次に示します。

  • 関数を記述するときにデフォルトで使用Seqします。これは、関数が任意の .NET コレクションで動作するためです。
  • またはSeqのような高度な機能が必要な場合に使用しますSeq.windowedSeq.pairwise

Seqデフォルトで選択するのが最良の選択肢だと思いますが、いつ別のタイプを選択するのでしょうか?

  • パターンListを使用した再帰的な処理が必要な場合に使用します (標準ライブラリでは利用できない機能を実装するため)。head::tail

  • Listステップバイステップで作成できる単純な不変データ構造が必要な場合に使用します
    (たとえば、あるスレッドでリストを処理する必要がある場合 - 統計を表示する必要がある場合) を受け取り、同時に別のスレッドでリストの作成を続けるより多くの値、つまりネットワーク サービスから)

  • 短いリストを使用するList場合に使用 - リストは、値がしばしば空のリストを表す場合に使用するのに最適なデータ構造です。そのシナリオでは非常に効率的です。

  • Array値型の大規模なコレクションが必要な場合に使用します
    (配列はデータをフラット メモリ ブロックに格納するため、この場合はメモリ効率が高くなります)。

  • Arrayランダム アクセスまたはより高いパフォーマンス (およびキャッシュの局所性) が必要な場合に使用します。

于 2012-05-30T10:31:08.783 に答える
30

次の場合にも適していseqます。

  • すべての要素を同時にメモリに保持する必要はありません。

  • パフォーマンスは重要ではありません。

  • 列挙の前後に何かを行う必要があります。たとえば、データベースに接続して接続を閉じます。

  • 連結していません(繰り返すSeq.appendとスタックオーバーフローになります)。

次の場合に優先list:

  • 要素が少ない。

  • あなたはたくさんの頭を前につけて斬首するでしょう。

どちらseqlist並列処理には適していませんが、必ずしもそれらが悪いというわけではありません。たとえば、どちらかを使用して、並行して実行される個別の作業項目の小さな束を表すことができます。

于 2012-05-30T15:22:22.450 に答える
13

1 つの小さな点: Seqandは、並列処理Arrayよりも優れています。List

いくつかのオプションがあります: F# PowerPack のPSeqArray.Parallelモジュール、およびAsync.Parallel (非同期計算)。リストは、そのシーケンシャルな性質 (head::tail合成) のため、並列実行には適していません。

于 2012-05-30T11:13:31.710 に答える
6

Seq公開 API で常に公開する必要があります。内部実装で and を使用しListます。Array

于 2012-05-31T06:26:59.910 に答える