web-dev-qa-db-ja.com

関数型プログラミングとOOP

最近、Haskellなどの関数型言語の使用について多くの話を聞いています。関数型プログラミングとオブジェクト指向プログラミングの大きな違い、長所と短所は何ですか?

95
GSto

関数型プログラミング命令型プログラミングのほうがいいと思います。

最大の違いは、命令型プログラミングは約制御フローであり、関数型プログラミングは約データフローであることです。別の言い方をすると、関数型プログラミングではexpressionsのみが使用され、命令型プログラミングではexpressionsの両方が使用されます。ステートメントが使用されます。

たとえば、imperativeプログラミング変数とループは状態を処理するときに一般的ですが、functionalプログラミングでは、状態はパラメーターの受け渡しによって処理されるため、副作用と代入が回避されます。

リストの合計を計算する関数の命令型疑似コード(合計は変数に保持されます):

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をお勧めします。

69
Jonas

関数型プログラミングは宣言型モデルに基づいており、そのルーツはラムダ計算にあります。それは、C++やC#のようなより命令的な言語から借りることができる多くの素晴らしい概念を提供します。

いくつかの例には、参照透過性、ラムダ関数、ファーストクラス関数、遅延評価と熱心な評価、および不変性が含まれます。

他に何もなければ、関数型プログラミングを学ぶことは、それが含む概念にとって有用です。それはあなたがプログラミングをし、プログラミングについて考える方法を変えます。そして、将来、関数型プログラミングはオブジェクト指向プログラミングと同じくらい重要になると思います。

はじめに、Haskellなどの純粋な関数型言語を使用するか、または F# のようなハイブリッド言語を使用するかを選択できます。

ほとんどの優れた大学は関数型プログラミングをカバーしており、学校に通うなら、そのコースを取ることを強くお勧めします。


関数型プログラミングとオブジェクト指向プログラミングの大きな違い、長所と短所は何ですか?

複雑な問題を階層にモデル化して問題を単純化できるので、オブジェクト指向プログラミングは優れています。しかし、可変オブジェクトを使用しているときにマルチスレッドプログラミングを検討し始めると、それは非常に困難になります。このような場合、同期オブジェクトを頻繁に使用する必要があり、大きなアプリケーションを完成させることはほぼ不可能です。

関数型プログラミングの出番です。不変性などの機能により、関数型プログラミングはマルチスレッドプログラムを本当に単純化します。関数への入力Xが与えられると常にYを出力することがわかっている場合、何かを並列化することはほとんど自明です。

16
Brian R. Bondy

(この回答は StackOverflowの終了した質問への回答 から転用されています。)

関数型プログラミングとオブジェクト指向プログラミングの大きな違いの1つは、それぞれが異なる種類のソフトウェアの進化に優れていることです。

  • オブジェクト指向言語は、thingsoperationsの固定セットがあり、コードが進化するにつれて、主に新しいもの。これは、既存のメソッドを実装する新しいクラスを追加することで実現でき、既存のクラスはそのままになります。

  • 関数型言語は、の固定セットがあり、コードが進化するにつれて、既存の操作を主に追加する場合に適しています事。これは、既存のデータ型で計算する新しい関数を追加することで実現でき、既存の関数はそのままになります。

進化が間違った方向に進むと、問題が発生します。

  • オブジェクト指向プログラムに新しい操作を追加するには、多くのクラス定義を編集して新しいメソッドを追加する必要がある場合があります。

  • 関数型プログラムに新しい種類のものを追加するには、多くの関数定義を編集して新しいケースを追加する必要がある場合があります。

この問題は長年にわたってよく知られています。 1998年、 Phil Wadlerが「表現の問題」と呼んだ 。一部の研究者は、表現の問題はミックスインなどの言語機能で対処できると考えていますが、広く受け入れられている解決策はまだ主流に達していません。

10
Norman Ramsey

本当の対はありません。それらは完全に補完し合うことができます。 FP OOPをサポートする言語があります。しかし、コミュニティーはモジュール性を処理する方法が異なります。

FP言語のユーザーは、数学的な法則を通じてモジュール性を達成する傾向があります。また、法則の遵守を示すために証明を好む傾向があります。

必須OOP=の場合、ユーザーはオブジェクトの動作をテストケースでキャプチャする傾向があります。これは、オブジェクトが変更され、このようにモジュール化されている場合に再実行できます。

これはほんの一部ですが、言及する価値があると思います。

5
Edgar Klerks

類推:

求人応募を受け取りました。名前、連絡先情報、職歴を記入します。完了すると、空のアプリケーションはなくなります。

代わりに、書く前に、透明なセロファンのシートでオーバーレイすると想像してください。あなたはあなたの名前を書きます。セロファンの別のシートを追加します。あなたはあなたの連絡先情報を書きます。もっとセロファン。あなたはあなたの職歴を書きます。終了しても、空のアプリケーションはそのままです。また、セロファンが3枚あり、それぞれに1つの個別の変化の影響が記録されています。

前者(OOP)は物事を適切に変更するという考えを採用し、後者(FP)はそれを回避します。どちらも状態管理パラダイムです。どちらも、異なる戦略を使用して、求人応募を完了する効果をキャプチャできます。 OOPは開始楽器を直接変更しますが、FPは以前のものをオーバーレイします 変更の外観を有効にするため

2
Mario T. Lanza