関数型プログラミングの利点は何だと思いますか? そして、それらは今日のプログラマーにどのように適用されるのでしょうか?
関数型プログラミングとOOPの最大の違いは何ですか?
関数型プログラミングの利点は何だと思いますか? そして、それらは今日のプログラマーにどのように適用されるのでしょうか?
関数型プログラミングとOOPの最大の違いは何ですか?
関数型プログラミングのスタイルは、それを取得する方法ではなく、必要なものを記述することです。つまり、反復子変数を使用して for ループを作成し、各セルに対して何かを行う配列を行進する代わりに、「このラベルは、この関数がすべてのセルで実行されたこの配列のバージョンを参照する」と同等のことを言うでしょう。要素。」
関数型プログラミングは、より基本的なプログラミングのアイデア、つまりリスト内包表記やキャッシングなどのアイデアをコンパイラに移します。
関数型プログラミングの最大の利点は、コードがより簡潔になるため、簡潔であることです。関数型プログラムは、ループの中心となる反復子変数を作成しないため、このようなオーバーヘッドやその他の種類のオーバーヘッドがコードから排除されます。
もう 1 つの主な利点は同時実行性です。これは関数型プログラミングで実行する方が簡単です。これは、状態変数を手動で設定する必要があったほとんどの操作 (ループ内のイテレーターなど) をコンパイラーが処理するためです。
ほとんどの関数型言語と拡張機能は遅延評価をサポートしているため、プログラムの作成方法によっては、単一プロセッサのコンテキストでもパフォーマンス上の利点が見られます。Haskell では、「このラベルはすべての偶数を含む配列を表す」と言えます。このような配列は無限に大きくなりますが、配列の初期化時に必要な最大値を知る必要なく、いつでもその配列の 100,000 番目の要素を要求できます。値は必要なときにのみ計算され、それ以上は計算されません。
最大の利点は、慣れていないことです。Scheme のような言語を選び、それを使って問題を解決する方法を学べば、既に知っている言語でより優れたプログラマーになることができます。それは、人間の第二言語を学ぶようなものです。比較するものが何もないので、他の人は基本的に自分自身のバリエーションだと思い込んでいます。他の人、特にあなたがすでに知っていることとは関係のない人にさらされることは有益です.
関数型プログラミングが重要な理由
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
概要
ソフトウェアがますます複雑になるにつれて、ソフトウェアを適切に構成することがますます重要になります。適切に構造化されたソフトウェアは、記述とデバッグが容易であり、将来のプログラミングコストを削減するために再利用できるモジュールのコレクションを提供します。
この論文では、特に関数型言語の2つの機能、高階関数と遅延評価がモジュール性に大きく貢献できることを示します。例として、リストとツリーを操作し、いくつかの数値アルゴリズムをプログラムし、アルファベータヒューリスティック(ゲームプレイプログラムで使用される人工知能のアルゴリズム)を実装します。モジュール性がプログラミングを成功させる鍵であるため、関数型プログラミングはソフトウェア開発に重要な利点を提供すると結論付けます。
したがって、良い出発点は、命令型言語では不可能であるが関数型言語では可能であるいくつかのことを理解しようとすることです。
計算可能性について話している場合、もちろん、機能的プログラミングでは可能であるが命令型プログラミングでは不可能なことは何もありません(またはその逆)。
さまざまなプログラミングパラダイムのポイントは、以前は不可能だったことが可能になることではなく、以前は困難だったことが簡単になることです。
関数型プログラミングは、簡潔でバグがなく、並列化可能なプログラムをより簡単に作成できるようにすることを目的としています。
関数型プログラミングの必要性の最も実用的な例は並行性だと思います。関数型プログラムは当然スレッドセーフであり、マルチコアハードウェアの台頭を考えると、これは非常に重要です。
関数型プログラミングはモジュール性も向上させます-命令型のメソッド/関数が長すぎることがよくあります-数行を超える関数はほとんど表示されません。そして、すべてが分離されているため、再利用性が大幅に向上し、単体テストが非常に簡単になります。
どちらか一方である必要はありません。C#3.0 のような言語を使用すると、それぞれの最適な要素を組み合わせることができます。OO はクラス レベル以上の大規模な構造に使用でき、関数型スタイルはメソッド レベルの小規模な構造に使用できます。
関数型スタイルを使用すると、制御フロー ステートメントなどと混同することなく、その意図を明確に宣言するコードを作成できます。 .
プログラムが大きくなると、ボキャブラリのコマンド数が多くなりすぎて、非常に使いにくくなります。これは、オブジェクト指向プログラミングが私たちの生活を楽にしてくれる場所です。コマンドをより良い方法で整理できるからです。顧客に関係するすべてのコマンドを顧客エンティティ (クラス) に関連付けることができるため、説明がより明確になります。ただし、プログラムは依然として、進行方法を指定する一連のコマンドです。
関数型プログラミングは、語彙を拡張するまったく異なる方法を提供します。新しいプリミティブ コマンドの追加に限定されません。また、新しい制御構造 (コマンドを組み合わせてプログラムを作成する方法を指定するプリミティブ) を追加することもできます。命令型言語では、一連のコマンドを作成したり、ループなどの限られた数の組み込み構造を使用してコマンドを作成したりできましたが、典型的なプログラムを見ると、依然として多くの繰り返し構造が見られます。コマンドを組み合わせる一般的な方法
関数型プログラミングを「必要性」の観点から考えないでください。代わりに、OOP、テンプレート、アセンブリ言語などを学んだときに考え方が完全に変わったように、それを別のプログラミング手法と考えてください。最終的に、関数型プログラミングを学ぶことで、より優れたプログラマーになることができます。
関数型プログラミングをまだ知らない場合は、関数型プログラミングを学ぶことで、問題を解決するためのより多くの方法が得られます。
FPは関数をファーストクラスの値に昇格させる単純な一般化ですが、OOPはコードの大規模な構造化用です。ただし、いくつかの重複があり、OOPデザインパターンは、ファーストクラスの関数を使用して直接かつはるかに簡潔に表現できます。
OCaml、C#3.0、F#など、多くの言語がFPとOOPの両方を提供します。
乾杯、ジョン・ハロップ。