上記の宣言型プログラミングの例は実際のプログラムではないため、良い例ではありません。
主な違いは、命令型と宣言型です。Functional は特定の種類の宣言です。
C、C++、Java、Javascript、BASIC、Python、Ruby、およびその他のほとんどのプログラミング言語が不可欠です。原則として、ループごとに明示的な代入操作で変数を変更する明示的なループ(for、while、repeat) がある場合、それは必須です。
SQL と XSLT は、宣言型プログラミングのよく知られた例です。HTML や CSS などのマークアップ言語も宣言型ですが、通常は任意のアルゴリズムを記述できるほど強力ではありません。
最初に命令型言語 (Javascript) で記述され、次に宣言型言語 (SQL) で記述された計算例 (適切なデータ ソースからの性別ごとの収入の合計) を次に示します。
命令型プログラミング
var income_m = 0, income_f = 0;
for (var i = 0; i < income_list.length; i++) {
if (income_list[i].gender == 'M')
income_m += income_list[i].income;
else
income_f += income_list[i].income;
}
知らせ:
- 現在の合計を含む変数の明示的な初期化。
- データを明示的にループし、制御変数 ( ) と各反復での累計を変更します。
i
- 条件 ( ) は、各反復でコード パスを選択するため
if
にのみ使用されます。
宣言型プログラミング
select gender, sum(income)
from income_list
group by gender;
知らせ:
- 実行中の合計を含むメモリセルは、必要に応じて宣言した出力によって暗示されます。
- CPU が実行する必要があるループ (たとえば、income_list テーブルに対して) は、必要な出力とソース データの構造によって暗示されます。
- 条件 (
case
SQL など) は、コード パスを選択するのではなく、入力値に基づいて必要な出力値を指定する機能的な方法で使用されます。
関数型プログラミング
上で述べたように、SQLは関数case
型プログラミングの優れた例であり、関数を構成することによって目的の計算が指定される宣言型プログラミングの制限されたサブセットです。
関数は、入力を受け取り、出力を返すものcase
です (例: 、sum()
…)
コンポジションとは、1 つの出力が次の入力としてどのように供給されるかを指定することによって、2 つ以上を連鎖させることを意味します(通常、一方を他方の内部に書き込むことによって)。入力して、目的の出力を取得します。
このスニペットでは、関数とを組み合わせて、必要な出力を宣言しています。これは関数型プログラミングと呼ばれます。 sum()
case
select
sum(case when some_flag = 'X' then some_column
else some_other_column end)
from
...
2 つ以上の関数の構成と入力データへの適用が、特定の言語で使用できる唯一の構造である場合、その言語は純粋に関数型であると言われます。これらの言語では、ループ、変数の割り当て、およびその他の通常は命令的なステートメントが完全に存在しないことに気付くでしょう。
編集: Javascript での関数型プログラミングに関するAnjana Vakilの講演をいくつか見て、それが何であるかをよりよく理解することをお勧めします。