web-dev-qa-db-ja.com

関数型プログラミングの利点は何ですか?

関数型プログラミングの利点は何だと思いますか?そして、今日のプログラマーにどのように適用されますか?

関数型プログラミングとOOPの最大の違いは何ですか?

90
Rayne

関数型プログラミングのスタイルは、取得方法ではなく、必要なものを記述することです。すなわち、イテレータ変数でforループを作成し、各セルに何かをする配列を行進する代わりに、「このラベルは、この関数が要素。」

関数型プログラミングは、リストの内包表記やキャッシングなどのより基本的なプログラミングのアイデアをコンパイラーに移します。

関数型プログラミングの最大の利点は簡潔さです。コードがより簡潔になる可能性があるためです。関数型プログラムはループの中心となるイテレーター変数を作成しないため、このオーバーヘッドや他の種類のオーバーヘッドはコードから排除されます。

もう1つの主な利点は並行性です。これは、コンパイラーが状態変数(ループ内の反復子など)を手動で設定する必要があった操作の大部分をコンパイラが処理するため、関数型プログラミングの方が簡単です。

ほとんどの関数型言語と拡張機能は遅延評価をサポートしているため、プログラムの記述方法によっては、シングルプロセッサのコンテキストでもパフォーマンス上の利点がいくつか見られます。 Haskellでは、「このラベルはすべての偶数を含む配列を表します」と言うことができます。このような配列は無限に大きくなりますが、配列初期化時に必要な最大値を知らなくても、いつでもその配列の100,000番目の要素を要求できます。値は、必要な場合にのみ計算され、それ以上は計算されません。

71
Chris Wenham

最大の利点は、慣れていないことです。 Schemeのような言語を選択して、問題を解決する方法を学べば、すでに知っている言語の優れたプログラマーになります。第二の人間の言語を学ぶようなものです。他の人と比較するものがないので、他の人は基本的に自分のバリエーションであると仮定します。他の人、あなたが既に知っていることとは関係のない特定の人への露出は有益です。

27
Kirk Strauser

機能プログラミングが重要な理由
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

要約

ソフトウェアがますます複雑になるにつれて、ソフトウェアを適切に構成することがますます重要になっています。適切に構造化されたソフトウェアは、簡単に作成およびデバッグでき、将来のプログラミングコストを削減するために再利用できるモジュールのコレクションを提供します。

この論文では、特に関数型言語の2つの機能である高階関数と遅延評価が、モジュール性に大きく貢献できることを示します。例として、リストとツリーを操作し、いくつかの数値アルゴリズムをプログラミングし、アルファベータヒューリスティック(ゲームプレイプログラムで使用される人工知能のアルゴリズム)を実装します。モジュール性はプログラミングの成功の鍵であるため、関数型プログラミングはソフトウェア開発に重要な利点をもたらすと結論付けています。

11
Robert Harvey

したがって、良い出発点は、命令型言語では不可能だが関数型言語では可能ないくつかのことを理解しようとすることです。

計算可能性について話している場合、関数型プログラミングでは不可能ですが、命令型プログラミングでは不可能なことはもちろんありません(またはその逆)。

さまざまなプログラミングパラダイムのポイントは、以前は不可能であったことを可能にすることではなく、以前は困難であったことを簡単にすることです。

関数型プログラミングは、簡潔でバグがなく、並列化可能なプログラムをより簡単に作成できるようにすることを目的としています。

10
sepp2k

関数型プログラミングの必要性の最も実用的な例は同時実行であると思います-関数型プログラムは当然スレッドセーフであり、マルチコアハードウェアの台頭を考えるとこれは非常に重要です。

関数型プログラミングではモジュール性も向上します-命令型のメソッド/関数が非常に長いことがよくあります-数行以上の関数はほとんどありません。また、すべてが分離されているため、再利用性が大幅に向上し、ユニットテストが非常に簡単になります。

5
Bozhidar Batsov

どちらかである必要はありません。C#3.0のような言語を使用すると、それぞれの最適な要素を混在させることができます。 OOはクラスレベル以上の大規模構造に使用でき、メソッドレベルの小規模構造には機能スタイルを使用できます。

Functionalスタイルを使用すると、制御フローステートメントなどと混同することなく、意図を明確に宣言するコードを記述できます。 。

5
Samuel Jack

プログラムが大きくなると、ボキャブラリー内のコマンドの数が非常に多くなり、使用が非常に難しくなります。これは、オブジェクト指向プログラミングが私たちの生活を楽にする場所です。なぜなら、より良い方法でコマンドを整理できるからです。顧客に関係するすべてのコマンドを何らかの顧客エンティティ(クラス)に関連付けることができるため、説明がより明確になります。ただし、プログラムは、それがどのように進むべきかを指定する一連のコマンドです。

関数型プログラミングは、語彙を拡張するまったく異なる方法を提供します。新しいプリミティブコマンドの追加に限定されません。新しい制御構造(コマンドを組み合わせてプログラムを作成する方法を指定するプリミティブ)を追加することもできます。命令型言語では、コマンドをシーケンスで作成したり、ループなどの限られた数の組み込み構造を使用したりできましたが、典型的なプログラムを見ると、多くの繰り返し構造が見られます。コマンドを結合する一般的な方法

3
Soner Gönül

関数型プログラミングを「必要」の観点から考えないでください。代わりに、OOP、テンプレート、アセンブリ言語などがあなたがそれらを学んだとき(もし)それらの考え方を完全に変えたかもしれないので、あなたの心を開く別のプログラミング技術と考えてください。最終的に、関数型プログラミングを学習することで、より優れたプログラマーになります。

1
Justin Ethier

関数型プログラミングをまだ知らない場合は、関数型プログラミングを学習することで、問題を解決する方法が増えます。

FPは関数を最初のクラス値に昇格させる単純な一般化であり、OOP=はコードの大規模な構造化のためです。ただし、OOP設計パターンは、ファーストクラスの関数を使用して直接、はるかに簡潔に表現できます。

OCaml、C#3.0、F#など、多くの言語でFPとOOPの両方が提供されています。

乾杯、ジョンハロップ。

0
Jon Harrop