概念と用語 (関数型変換)
このトピックでは、純粋関数型変換の概念と用語について説明します。 データの変換に対して関数型変換の方法を使用すると、多くの場合、従来の命令型のプログラミングよりすばやいプログラミングが可能になります。また、さまざまな表現を使用した、デバッグや保守の容易なコードが生成されます。
このセクションのトピックでは、関数型プログラミングのすべてを説明するのではなく、 XML の変換を容易にするいくつかの機能を紹介することを目的としています。
純粋関数型変換とは
純粋関数型変換では、純粋関数と呼ばれる一連の関数により、一連の構造化データを元の形式から別の形式へと変換する方法が定義されます。 "純粋" という語は、それらの関数がコンポーザブルであることを示しています。関数がコンポーザブルであるためには、次の特性を持っている必要があります。
自己完結している。このため、プログラムの他の部分との結び付きや相互依存を気にせずに、関数を自由に並べ替えることができます。 純粋変換では、その環境を考慮する必要はなく、また環境に対して影響を与えることもありません。 つまり、変換で使用される関数には副作用がありません。
状態がない。このため、同じ関数または関数のセットを同じ入力に対して実行すると、常に同じ出力が得られます。 純粋変換には、以前に使用されたときの情報は保持されません。
重要
このチュートリアルの以降では、"純粋関数" という用語を、特定の言語機能ではなくプログラミング方法を指す広い意味で使用します。
純粋関数は、C# ではメソッドとして、Visual Basic では関数として実装する必要があります (Visual Basic では、サブルーチンは値を返すことができないため、純粋関数型変換を記述するときにサブルーチンは使用されません)。
また、純粋関数を C++ の純粋仮想メソッドと混同しないようにしてください。 純粋仮想メソッドとは、そのメソッドを含むクラスが抽象クラスであり、メソッドの本体が提供されないことを指します。
関数型プログラミング
関数型プログラミングとは、純粋関数型変換を直接サポートするプログラミング方法です。
これまで、ML、Scheme、Haskell、F# (Microsoft Research による言語) などの汎用関数型プログラミング言語に対する関心は、主に学術的な分野に限られていました。 C# や Visual Basic では常に純粋関数型変換を記述することが可能でしたが、その難しさから、ほとんどのプログラマにとっては魅力的な選択肢になりませんでした。 しかし、C# 3.0 と Visual Basic 9.0 では、ラムダ式や型の推定などの新しい言語構成要素により、関数型プログラミングがはるかに簡単で生産性の高いものとなっています。
関数型プログラミングの詳細については、「関数型プログラミングと命令型プログラミング」を参照してください。
特定領域の FP 言語
広く採用されるに至らなかった汎用関数型プログラミング言語に比べると、特定領域の関数型プログラミング言語は成功していると言えます。 たとえば、カスケード スタイル シート (CSS) は多くの Web ページのルック アンド フィールの決定に利用されていますし、Extensible Stylesheet Language Transformations (XSLT) スタイル シートは XML データ操作に広く利用されています。 XSLT の詳細については、「XSLT 変換」を参照してください。
用語
次の表に、関数型変換に関連するいくつかの用語の定義を示します。
高階 (ファーストクラス) 関数
プログラム オブジェクトとして扱うことのできる関数です。 たとえば、他の関数に渡したり、他の関数から返したりすることができます。 C# や Visual Basic では、高階関数をサポートする言語機能として、デリゲートやラムダ式があります。 高階関数を記述するには、デリゲートを受け取る引数を 1 つ以上宣言し、通常はラムダ式を使用して呼び出します。 標準クエリ演算子の多くは高階関数です。詳細については、「標準クエリ演算子の概要」を参照してください。
ラムダ式
基本的には、デリゲート型が必要とされる場所で使用できるインラインの匿名関数です。 これは簡略化した定義ですが、このチュートリアルの目的には十分です。詳細については、「ラムダ式 (C# プログラミング ガイド)」または「ラムダ式 (Visual Basic)」を参照してください。
コレクション
データの構造化されたセットです。コレクション内のデータは同じ型であるのが一般的です。 コレクションで LINQ との互換性を確保するには、IEnumerable インターフェイスか IQueryable インターフェイス (または対応するジェネリック インターフェイスである IEnumerator<T> か IQueryable<T>) を実装する必要があります。組 (匿名型)
組は数学的概念で、それぞれが特定の型を持つオブジェクトの有限のシーケンスを意味します。 順序付きリストとも呼ばれます。 匿名型は、この概念の言語実装です。匿名型を使用すると、名前のないクラス型を宣言し、同時にその型のオブジェクトをインスタンス化することができます。詳細については、「匿名型 (C# プログラミング ガイド)」または「匿名型 (Visual Basic)」を参照してください。
型の推定 (暗黙の型指定)
明示的な型宣言がない場合に変数の型を特定するコンパイラの機能です。詳細については、「暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)」または「ローカル型の推論 (Visual Basic)」を参照してください。
遅延実行とレイジー評価
解決された値が実際に必要となるまで式の評価を遅らせることを意味します。 遅延実行はコレクションでサポートされています。詳細については、「LINQ クエリの概要 (C#)」および「LINQ to XML における遅延実行とレイジー評価」を参照してください。
これらの言語機能は、このセクション全体にわたってサンプル コードで使用されています。