手続き的プログラミング]1と関数的プログラミングの両方のWikipedia記事を読んだのですが、まだ少し混乱しています。どなたか、核心を突いて説明していただけませんか?
関数型言語では(理想的には)数学的な関数、つまり n 個の引数を取って値を返す関数を書くことができます。プログラムが実行されると、この関数が必要に応じて論理的に評価されます。1
一方、手続き型言語は、一連のsequentialなステップを実行するものです。(逐次論理を関数論理に変換する方法として、継続渡し形式というものがあります)。
その結果,純然たる関数型プログラムは,入力に対して常に同じ値*を返すことになり,評価の順序がうまく定義されない.これは,ユーザ入力やランダムな値のような不確実な値を純然たる関数型言語でモデル化することが困難であることを意味する.
1 この回答の他のすべてと同様に、これは一般化です。この特性は、計算が呼び出された場所で順次評価するのではなく、その結果が必要とされるときに評価するというもので、「遅延性」として知られています。すべての関数型言語が実際に普遍的に遅延であるわけではありませんし、遅延が関数型プログラミングに限定されるわけでもありません。むしろ、ここで示された説明は、異なるプログラミングスタイルについて考えるための「心の枠組み」を提供するものであり、それは明確で対極的なカテゴリではなく、流動的な考えなのです。
手続き型/機能型/客観的プログラミングは、問題への取り組み方に関するものだと思います。
最初のスタイルはすべてをステップに計画し、一度に1つのステップ(手順)を実装することで問題を解決します。 一方、機能プログラミングは、問題がサブ問題に分割され、各サブ問題が解決され(そのサブ問題を解決するための関数が作成されます)、結果が結合されて、問題全体の答えを作成します。 最後に、Objectiveプログラミングは、コンピューター内に多くのオブジェクトを含むミニワールドを作成することで現実の世界を模倣します。各オブジェクトには(ある程度)固有の特性があり、他のオブジェクトと相互作用します。 それらの相互作用から結果が現れます。
プログラミングの各スタイルには、独自の長所と短所があります。 したがって、「純粋なプログラミング」などのことを行う(つまり、. 純粋に手続き型-誰もこれを行いません。, ちなみに。, これは奇妙なことです-または純粋に機能的または純粋に客観的です。) 非常に困難です。, 不可能ではないにしても。, プログラミングスタイルの利点を実証するために特別に設計されたいくつかの基本的な問題を除いて。 (したがって。, 私たちは、純粋さとクォートが好きな人を呼びます。;weenie"。; :D。).
次に、これらのスタイルから、各スタイルに最適化されるように設計されたプログラミング言語があります。 たとえば、アセンブリはすべて手続きに関するものです。 さて、C、PascalなどのAsmだけでなく、ほとんどの初期の言語は手続き型です(そしてFortran、私は聞いた)。 次に、すべての有名なJavaを対物学校に配置します(実際、JavaとC#も「お金志向」と呼ばれるクラスにいますが、それは別の議論の対象です)。 また、Smalltalkも目的です。 機能的な学校では、「ほぼ機能的」(不純であると見なされる人もいる)LispファミリーとMLファミリー、および多くの「純粋に機能的」なHaskell、Erlangなどがいます。 ちなみに、Perl、Python、Rubyなど、多くの一般的な言語があります。
Konrad'さんのコメントを拡大します。
純粋な関数型プログラムは、入力に対して常に同じ値を返すので、評価の順序はよく定義されていません。
このため、関数型コードは一般に並列化しやすい。 関数には副作用がなく、引数に作用するだけなので、多くの並行処理が不要になります。
また、関数型プログラミングは、自分のコードが正しいことを証明する必要がある場合にも使われます。 手続き型プログラミングでは、これが非常に難しいのです(関数型プログラミングでは簡単ではありませんが、それでも簡単です)。
免責事項:私は何年も関数型プログラミングを使っておらず、最近また見始めたばかりなので、ここが完全に正しいとは言えないかもしれません。)
コンラッドのコメントを拡張するには:
評価の順序は違います。 明確に定義されています。
一部の機能言語には、いわゆるレイジー評価があります。 つまり、値が必要になるまで関数は実行されません。 その時まで、関数自体が回されます。
手続き言語はステップ1ステップ2ステップ3です。.. ステップ2で2 + 2を追加すると言った場合、それは正しく行われます。 怠惰な評価では、2 + 2を追加すると言いますが、結果が使用されない場合は、追加されません。