54

私は命令型プログラミングに慣れすぎています。命令型プログラミングとは、最終結果を得るために手順を段階的に実行するようコンピューターに指示する通常の方法です。一方、宣言型プログラミングは、入力を渡すだけで、出力がどのように行われるかの手順を記述せずに期待します。私が混乱しているのは関数型プログラミングです。関数型プログラミングは、計算を数学関数の評価として扱い、状態と変更可能なデータを回避するプログラミング パラダイムであり、宣言型言語の一種ではないことを私は知っています。しかし、私はそれがどのように機能するかをまだ理解できません。

フィボナッチ数列を実行する例を見てみましょう。

命令型プログラミング:

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
  int n,i,c,a=0,b=1; 
  printf("Enter Fibonacci series of nth term : "); 
  scanf("%d",&n); 
  printf("%d %d ",a,b); 
  for(i=0;i<=(n-3);i++) 
  { 
    c=a+b; 
    a=b; 
    b=c;    
  } 
  printf("%d ",c);
  getch(); 
} 

宣言型プログラミング:

Give the nth number and it will return the value of the nth number

機能プログラムはどのように機能しますか?

さらに、私の定義が間違っている場合は修正してください。お気軽にコメントください..

4

5 に答える 5

104

上記の宣言型プログラミングの例は実際のプログラムではないため、良い例ではありません。

主な違いは、命令型と宣言型です。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 テーブルに対して) は、必要な出力とソース データの構造によって暗示されます。
  • 条件 ( caseSQL など) は、コード パスを選択するのではなく、入力値に基づいて必要な出力値を指定する機能的な方法で使用されます。

関数型プログラミング

上で述べたように、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の講演をいくつか見て、それが何であるかをよりよく理解することをお勧めします。

于 2013-03-12T10:41:22.707 に答える
5

命令型プログラミングが宣言型プログラミングと区別されていると主張するのは、後者の順序付けの欠如を誤って想定することによって、誤って過度に単純化されています。

純粋な関数型プログラミングは、順序と実装を表現することを妨げられません。むしろ、操作的意味レベルでランダムな偶発的な順序を表現することはできません。また、宣言型スタイルの形式である「Do n't repeatself」(DRY)という利点もあります(以下を参照)。

ただし、純粋関数型プログラミングは、宣言型の高レベルのセマンティクスを保証するものではありません。このためには、宣言型と命令型の正しい定義を適用する必要があります。

于 2013-03-12T09:20:39.977 に答える
1

c フィルターを考えてみてください。stdin から読み取り、stdout に書き込む場所。コードは命令的かもしれませんが、プログラムは関数のように使用されます。プログラム ' functionがあり、それにパイプするとします:

cat foo |関数 |ティーバー

関数を介して foo の内容をフィルタリングし、次にフィルターteeを介して stdout への書き込みとbarの作成の両方を行います。grepawkについても考えてください。両方のイテレータが暗示され、関数のように使用されます。

于 2012-06-07T15:09:13.417 に答える