関数型プログラミングにおいて、filter は、データ構造(通常はリスト) を何らかの順序で処理し、指定された述語がブール値を返す元のデータ構造の要素を正確に含む新しいデータ構造を生成する高階関数です。
true
例
Haskellでは、コード例
フィルター偶数[ 1 .. 10 ]
は、1、2、… 、10 の整数のリストの各要素に述語をevenこの順序で適用し、述語がブール値 true を返す要素の新しいリストを作成することにより、リスト 2、4、…、10 に評価され、その結果、そのリストの偶数のメンバーのみを含むリストが生成されます。逆に、コード例
フィルター(ない.偶数) [ 1 .. 10 ]
even述語がブール値 false を返す整数のリスト 1、2、…、10 の要素を収集して、リスト 1、3、…、9 に評価されます( は関数合成演算子.です)。
視覚的な例
X = [0, 5, 8, 3, 2, 1]以下に、関数に従って整数のリストのフィルター処理の各ステップのビューを示します。
この関数は、が偶数の場合、戻り値は であり、そうでない場合は であることを表します。これが述語です。

言語の比較
filterは多くのプログラミング言語、例えばHaskell、[1]
OCaml、[2]
Standard ML、[3]
Erlangの標準関数です。[4]
Common Lispは関数remove-ifとを提供しますremove-if-not。[5]
Scheme Requests for Implementation (SRFI) 1は、言語Schemeのfilterの実装を提供します。[6]
C++はアルゴリズム remove_if(mutating)とremove_copy_if(non-mutating)を提供します。C ++11はさらにcopy_if(non-mutating)を提供します。[7] Smalltalkはコレクション用のメソッドを提供します。filterは、リスト内包表記select:をサポートする言語ではそれを使用して実現することもできます。
Haskell では、filter次のように実装できます。
フィルター:: ( a -> Bool ) -> [ a ] -> [ a ]フィルター_ [] = []フィルターp ( x : xs ) = [ x | p x ] ++フィルターp xs
ここで、[]は空のリスト、++はリスト連結演算を表し、 は条件が成り立つ場合( と評価される場合)、条件[x | p x]付きで値 を保持するリストを表します。
xp xTrue
バリエーション
フィルターは元のリストを変更せずに結果を作成します。多くのプログラミング言語では、パフォーマンスを高速化するために、代わりにリスト引数を破壊的に変更するバリアントも提供されています。フィルターの他のバリアント(Haskell dropWhile[14]およびpartition[15]など)も一般的です。純粋に関数型のプログラミング言語の一般的なメモリ最適化は、入力リストとフィルタリングされた結果に最長の共通テール(テール共有)を持たせることです。
参照
参考文献
- ^ Haskell 標準プレリュードのフィルタ
- ^ OCaml標準ライブラリモジュールのフィルタ
list - ^ 「リスト構造」。標準 ML 基礎ライブラリ。2007年 9 月 25 日閲覧。
- ^ Erlang STDLIBリファレンスマニュアルのモジュールのドキュメントのfilter/2
lists - ^ ab Common Lisp HyperSpecの関数 REMOVE、REMOVE-IF、REMOVE-IF-NOT、DELETE、DELETE-IF、DELETE-IF-NOT
- ^ SRFI 1 のフィルタ
- ^ SGI標準テンプレートライブラリ(STL) 仕様の remove_if と remove_copy_if
- ^ ClojureDocs の clojure.core/filter
- ^ Common Lisp HyperSpecの関数 COMPLEMENT
- ^ Common Lisp HyperSpecの関数 EVENP、ODDP
- ^ ISO/IEC 13211-1:1995/Cor 2:2012
- ^ “技術的正誤表草案 2”.
- ^ 「組み込み関数 — Python 3.9.0 ドキュメント」。docs.python.org 。 2020年10月28日閲覧。
- ^ Haskell フィルター dropWhile
- ^ Haskell フィルタパーティション
