web-dev-qa-db-ja.com

関数型プログラミング言語を使用する場合

どのような状況で、C++、C#、Javaなどのより冗長なオブジェクト指向言語よりも、関数型プログラミング言語を使用することを選択する必要がありますか?

私は関数型プログラミングが何であるかを理解していますが、私が本当に理解していないのは、それが完璧な解決策である問題のタイプです。

79
Alex Baranosky

私の意見では、関数型言語は主に次の2つの目的に適しています:ゲームAIと数学計算。ニースリストの操作(少なくともLISPとScheme)のためにゲームAIで、構文のために数学的計算に適しています。 Scheme、LISP、およびHaskellには、数学的計算を読みやすくする構文があります。最後に追加しなければならないのは、関数型言語は本当に楽しい言語だということです。私のSchemeコースは、私が最も楽しかったコースの1つでした。

47
martiert

私はこれについていくつかの研究を行ってきましたが、関数型言語を使用する理由のリストにCONCURRENCYを追加するかもしれないと考えました。近い将来のある時点で、同じCPUテクノロジーを使用してプロセッサー速度を上げることはできません。アーキテクチャの物理学ではそれができません。

それが並行処理の出番です。

残念なことに、ほとんどのOOP言語は、データ間の相互依存性のため、一度に複数のプロセッサを利用できません。

純粋な関数型プログラミング言語では、コンピューターは2つ(またはそれ以上)の関数を実行できます。これらの関数は外部の状態情報を変更しないためです。

ここにあなたが楽しむことができる関数型プログラミングに関する 優秀な記事 があります。

85
Alex Baranosky

私の友人は、大学の教授の一人が次のようなことを言っていると言った。

上部にデータ型を、左側にそれらのデータ型に対する操作を含むグリッドを描画します。グリッドを垂直方向にスライスすると、オブジェクト指向ができます。グリッドを水平にスライスすると、FPを実行します。

私の答えはFPはOOと同じくらい幅広いアプリケーションでプログラミングするための完全に実行可能なアプローチです。プログラミング言語の選択に関する他の議論と同様に、私はより重要な質問があると思います:

  1. 新しい表記法や新しい考え方を学ぶことに投資する時間はありますか?
  2. あなたが検討している言語のうち、車輪の再発明にとらわれないほど十分に豊富なライブラリを持っているものはどれですか?

最初の質問については、主に学習価値のためにこれを行っている場合は、 Haskell を参照することをお勧めします。これは、幅広いサポート資料(書籍、記事、アクティブなコミュニティなど)があるためです。 )

2番目の質問に関して、Haskellには素晴らしいライブラリがあります(ただし、一部は他のライブラリよりも成熟しています) Scala (JVM上で動作するハイブリッドOO機能言語)には、次の利点があります。より徐々に機能的なスタイルに移行し、Javaでアクセス可能なすべてのライブラリを利用できます。

13
joel.neely

実質的にPPでできることはすべてFPで行うことができ、同じことを逆に行うことができます。何かをコーディングする別の方法です。問題に対する別の視点とそれを解決する別の方法です。

ただし、FPを使用する人はあまり多くないため、問題は、優れたライブラリの不足、移植性/保守性(メンテナーがSchemeよりもC++で記述されたものを理解する可能性が高いため)、およびドキュメントとコミュニティの不足にあります。ドキュメントがあることは知っていますが、C++、C#、またはJavaと比較してください。

ただし、FPを本当に実行したい場合は、C++およびC#でもこのスタイルを使用できます。もちろん、100%にはなりませんFP標準ライブラリを使用する場合。残念ながら、C#は関数型プログラミングでの使用に最適化されていないと思います。パフォーマンスの問題。

これは主観的な投稿であり、FPについて私が考えていることです。厳密な宣言ではありません。

9
user35978

関数型言語は多くの状況で優れています。特定の関数型言語のライブラリに依存します。

「オブジェクト指向プログラミング言語をいつ使用するか」という質問にどのように答えますか?

4
Jules

これは非常に主観的な質問ですが、機能言語は解析に多く使用されることを付け加えたいと思います ドメイン固有言語 ;機能的な性質は、文法の解析に適しています。

3
csl

私が見たものから、それは機能性よりも好みの問題です(しゃれは意図されていません)。どちらの言語のスタイルについても、特定のタスクで本質的に向上または悪化させるものは何もありません。

1
T.E.D.

一般に、問題の解決策を最も簡単に表現できる言語を使用します。関数型プログラミングの場合、これは、問題の解決策がfunctionsの用語で簡単に表現されるときです。一般に、数学演算、AI、パターンマッチングに適しています。一般に、回答を得るために適用する必要がある一連のルールに分解できるもの。問題を十分に分析して初めて、使用する「最適な」言語を決定できます。これは、擬似コードが役立つ場所です。 FPに似た擬似コードを書いていることに気付いたら、FPを使用してください。

もちろん、すべての完全なプログラミング言語は機能的に同等であるため、どの問題を解決できるかという点でどちらを選択するかは問題ではありません。主な効果は、コーディングの効率と精度、およびメンテナンスの容易さの点にあります。

また、巧妙に設計されたAPIを使用して、FP言語内でOOを模倣することもできます。たとえば、メソッドチェーンを使用してJava DSLをシミュレートする多数のFPライブラリ(JMockがその一例です)を見てきました。次に、次のような構造が表示されます。

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

これは基本的に、モックオブジェクトの呼び出しシーケンスが正しいかどうかを判断するために評価される関数を構築します。 ( http://www.jmock.org/yoga.html から盗まれた例)

それ以外の場合のOO言語における別のFPライクな構文は、Rubyなどのクロージャーの使用です。

1
Phil