最近、Haskellなどの関数型言語の使用について多くの話を聞いたことがあります。関数型プログラミングとオブジェクト指向プログラミングの大きな違い、長所と短所は何ですか?
最近、Haskellなどの関数型言語の使用について多くの話を聞いたことがあります。関数型プログラミングとオブジェクト指向プログラミングの大きな違い、長所と短所は何ですか?
回答:
私はそれがより機能的なプログラミング対命令型プログラミングであると言うでしょう。
最大の違いは、命令型プログラミングは制御フローに関するものであり、関数型プログラミングはデータフローに関するものです。別の言い方をすれば、関数型プログラミングでは式のみを使用し、命令型プログラミングでは式とステートメントの両方を使用します。
たとえば、命令型プログラミングでは変数とループは状態を処理するときに一般的ですが、関数型プログラミングでは状態はパラメーターの受け渡しを介して処理されるため、副作用や割り当てを回避できます。
リストの合計を計算するための関数の命令型擬似コード(合計は変数に保持されます):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
同じ関数の機能的な擬似コード(合計はパラメーターとして渡されます):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
機能概念の入門として、Simon Peyton-Jonesによる関数プログラミングによるTaming Effectsのプレゼンテーションをお勧めします。
関数型プログラミングは宣言型モデルに基づいており、そのルーツはラムダ計算に基づいています。C ++やC#などのより命令型の言語から借りることができる多くの素晴らしい概念を提供します。
いくつかの例には、参照透過性、ラムダ関数、ファーストクラス関数、遅延評価と熱心な評価、および不変性が含まれます。
関数型プログラミングを学ぶことが他に何も含まれていない場合は、その概念に役立ちます。それはあなたがプログラミングをする方法を変え、プログラミングについて考えるでしょう。そして、将来、関数型プログラミングはオブジェクト指向プログラミングと同じくらい重要になると思います。
開始するには、Haskellなどの純粋な関数型言語を使用するか、F#のようなハイブリッド言語を使用することを選択できます。
ほとんどの優れた大学は関数型プログラミングをカバーしています。学校に行くなら、そのコースを取ることを強くお勧めします。
関数型プログラミングとオブジェクト指向プログラミングの大きな違い、長所と短所は何ですか?
オブジェクト指向プログラミングは、複雑な問題を階層にモデル化して問題を単純化できるため、優れています。しかし、可変オブジェクトを使用しながらマルチスレッドプログラミングを検討し始めると、非常に困難になります。このような場合、同期オブジェクトを頻繁に使用する必要があり、大規模なアプリケーションを完成させることはほぼ不可能です。
それが関数型プログラミングの出番です。不変性のようなものがあるため、関数型プログラミングは本当にマルチスレッドプログラムを単純化します。関数への入力Xが常にYを出力することがわかっている場合、何かを並列化することはほとんど簡単になります。また、変数(または関数型プログラミングの値)は別のスレッドから使用中に変更できないことも知っています。
(この回答は、StackOverflowの非公開の質問への回答から適応されています。)
関数型プログラミングとオブジェクト指向プログラミングの大きな違いの1つは、それぞれが異なる種類のソフトウェアの進化に優れていることです。
オブジェクト指向言語は、事物に対する一連の操作が決まっている場合に適しています。コードが進化するにつれて、主に新しいものを追加します。これは、既存のメソッドを実装する新しいクラスを追加することで実現でき、既存のクラスはそのまま残されます。
物事の固定セットがある場合、関数型言語は適切 であり、コードが進化するにつれて、主に既存のものに新しい操作を追加します。これは、既存のデータ型で計算する新しい関数を追加することで実現でき、既存の関数はそのまま残されます。
進化が間違った方向に進むと、問題が生じます。
オブジェクト指向プログラムに新しい操作を追加するには、多くのクラス定義を編集して新しいメソッドを追加する必要があります。
機能プログラムに新しい種類のものを追加するには、多くの機能定義を編集して新しいケースを追加する必要があります。
この問題は長年にわたって知られています。1998年、フィル・ワドラーはそれを「表現の問題」と呼んだ。表現の問題はミックスインなどの言語機能で対処できると考える研究者もいますが、広く受け入れられている解決策はまだ主流に達していない。
類推:
求人に応募しました。名前、連絡先情報、仕事の履歴を入力します。終了すると、空のアプリケーションはなくなります。
代わりに、書く前に、セロハンの透明なシートでオーバーレイすることを想像してください。あなたの名前を書きます。セロファンの別のシートを追加します。連絡先情報を書きます。より多くのセロファン。仕事の履歴を書きます。終了しても、空白のアプリケーションはそのままです。また、3枚のセロハンのシートがあり、それぞれが単一の個別の変化の効果をキャプチャしています。
前者(OOP)はその場で物事を変えるという考えを受け入れ、後者(FP)はそれを避けます。どちらも状態管理のパラダイムです。両方とも、異なる戦略を使用して、求職申請を完了する効果をキャプチャできます。OOPは開始インストゥルメントを直接変更し、FP は変更の外観に影響を与えるために前に来たものをオーバーレイします。