関数型プログラミングの利点は何ですか?[閉まっている]


95

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

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


5
ブラブのパラドックス。paulgraham.com/avg.html
missingfaktor

回答:


75

関数型プログラミングのスタイルは、取得する方法ではなく、必要なものを記述することです。つまり、イテレータ変数を使用してforループを作成し、配列を介して各セルに何かを行うのではなく、「このラベルは、この関数がすべての配列で実行されているこの配列のバージョンを指します。要素。」

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

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

他の主な利点は同時実行性です。これは、関数型プログラミングで実行するのが簡単です。これは、以前は手動で状態変数を設定する必要があった操作(ループ内の反復子など)のほとんどを処理するためです。

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


12
最初の段落は、関数型プログラミングよりもPrologのような宣言型リレーショナルプログラミングの説明に近いと思います。
McPherrinM 2010年

6
@McPherrinM:関数型言語は命令型ではなく宣言型です。
Lie Ryan

2
手続き型とFPで、DPとIPを混同しているようです。FPは、関数の構成を強調することで、関心の分離を提供しています。つまり、決定論的計算のサブ計算間の依存関係を分離します。
シェルビームーアIII

2
@LieRyanが正しくありません。私の以前のコメントのリンクを参照してください
シェルビームーアIII

並行性は、相互に作用する可能性のある複数のスレッドを使用することであり、これは必須です。複数の独立した計算を同時に行うことを並列処理と呼びますen.wikipedia.org/wiki/Concurrency_(computer_science)を
Lambda Fairy

29

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


28
それはそれを学ぶことの利益であり、パラダイム自体の利益ではありません
Moe

2
しかし、それらは本当に分離していますか?元の質問者の観点からは、私はそうは思わないでしょう-彼らは、関数型言語を学ぶために努力を費やすことの合計で利益を探している可能性が最も高いです。
Kendall Helmstetter Gelner、

3
「それはそれを学ぶことの利益であり、パラダイム自体の利益ではない」。パラダイムは他のOOP作業に漏れ、そこでの開発を簡素化するのに役立ちます。「この入力からこの出力を計算する」および「新しいデータを計算するこれらの2つの関数を構成する」から問題にアプローチできます。そして、「これらの手順を正しい順序で実行させましたか?」真剣に、(FPパラダイムの理解から)Python、C#、C ++、Javaでこれらのメリットを得て、名前を付けます。
Jared Updike、

11

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

概要

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

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


10

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

計算可能性について話している場合、関数型プログラミングでは不可能ですが、命令型プログラミングでは不可能です(またはその逆)。

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

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


5

C#3.0のような言語を使用すると、それぞれの最良の要素を組み合わせることができます。オブジェクト指向は、クラスレベル以上の大規模構造に使用できます。メソッドレベルの小規模構造の機能スタイル。

関数スタイルを使用すると、制御フローステートメントなどと混同することなく、意図を明確に宣言するコードを記述できます。副作用のないプログラミングなどの原則により、コードについて推論し、その正確性を確認することがはるかに容易になります。


5

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

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


3

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

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


1

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


0

関数型プログラミングをまだ知らない場合は、それを学ぶことで問題を解決するより多くの方法が得られます。

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

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

乾杯、ジョン・ハーロップ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.