作成したコレクションに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>の関数がご使用のタイプで機能するように実装しますSeqMyCollection標準関数(少なくともユーザーにとって重要な関数)の効率的な実装を含み、コレクションに固有の機能を追加するモジュールを作成します。