作成したコレクションにIEnumerableを実装しましたが、(すべてをテストしたわけではありませんが)Seq値は正しく機能しているように見えます。コレクションの値のネイティブパフォーマンスがSeqのIEnumerableベースの関数を使用するよりも優れている場合、一部のSeq値、たとえば「last」をオーバーライドすることは可能ですか?Seqのオーバーライドに関する情報は見つかりませんでした。
2 に答える
いいえ-Seq
モジュール内の関数をオーバーライドすることはできません。ただし、それらの一部は、入力値(seq<'T>
渡すインスタンス)をチェックして、IList<'T>
または'T[]
;のインスタンスであるかどうかを確認することにより、パフォーマンスを最適化しようとします。そうである場合、関数は最適化されたコードパスを取ります。たとえば、配列('T[]
)をに渡すと、配列のプロパティをSeq.length
使用して長さをすばやく決定できます。.Length
モジュールの使用に固執している場合、Seq
私が考えることができる唯一のパフォーマンスの最適化は、コレクションにも実装ICollection<'T>
および/またはを含めることIList<'T>
です。それはいくつかのケースを最適化するかもしれませんが、それはすべてのケースではありません。
Seq
他の回答ですでに述べたように、モジュール内の関数をオーバーライドする方法はありません。カスタムコレクションを実装する場合、最善の方法は、コアF#ライブラリで使用される標準パターンに従うことです。
この
Seq
モジュールには、最も頻繁に使用される関数と、任意のシーケンスに合理的に提供できる関数が含まれています。モジュールは、特定のコレクションタイプに対してより効率的な実装を好む
Array
かList
提供し、コレクションに固有の関数(では使用できませんSeq
)を追加します(たとえば、関数List.tail
やArray.get
)。
独自のコレクションを追加する場合の最良の方法は、次のパターンに従うことです。
モジュール
IEnumerable<'T>
の関数がご使用のタイプで機能するように実装しますSeq
MyCollection
標準関数(少なくともユーザーにとって重要な関数)の効率的な実装を含み、コレクションに固有の機能を追加するモジュールを作成します。