C ++、C#、Javaなどのより冗長なオブジェクト指向言語よりも関数型プログラミング言語を使用することを選択する必要があるのはどのような状況ですか?
関数型プログラミングとは何かを理解していますが、実際には理解していないのは、どのような種類の問題に対して完璧な解決策であるかということです。
C ++、C#、Javaなどのより冗長なオブジェクト指向言語よりも関数型プログラミング言語を使用することを選択する必要があるのはどのような状況ですか?
関数型プログラミングとは何かを理解していますが、実際には理解していないのは、どのような種類の問題に対して完璧な解決策であるかということです。
回答:
関数型言語は、私の意見では、主に2つのことに適しています。ゲームAIと数学的計算です。それは、その優れたリスト操作(少なくともLispとScheme)のためにゲームAIに、そしてその構文のために数学的計算に適しています。Scheme、Lisp、Haskellには、数学的な計算を読みやすくする構文があります。最後に付け加えなければならないのは、関数型言語は本当に楽しい言語だということです。私のSchemeコースは、私が最も楽しんだコースの1つでした。
私はこれについて自分で調査し、関数型言語を使用する理由のリストに並行性を追加するかもしれないと考えました。近い将来のある時点で、同じCPUテクノロジーを使用してプロセッサ速度を上げることができなくなることを確認してください。アーキテクチャの物理学はそれを許可しません。
そこで、並行処理が登場します。
残念ながら、ほとんどのOOP言語は、データ間の相互依存性のために、一度に複数のプロセッサを利用することはできません。
純粋な関数型プログラミング言語では、これらの関数は外部の状態情報を変更しないため、コンピューターは一度に2つ(またはそれ以上)の関数を実行できます。
これはあなたが楽しむことができる関数型プログラミングに関する優れた記事です。
私の友人は、彼の大学教授の1人が次のようなことを言っていると引用しました。
上部にデータ型があり、左側にそれらのデータ型の操作があるグリッドを描画します。グリッドを垂直にスライスすると、OOを実行します。グリッドを水平方向にスライスすると、FPを実行します。
私の答えは、FPは、OOと同じくらい幅広いアプリケーションでプログラミングするための完全に実行可能なアプローチであるということです。他のプログラミング言語選択の議論と同様に、私はより重要な質問は次のとおりだと思います。
最初の質問に関して、これを主に学習価値のために行っているのであれば、Haskellを見ることをお勧めします、サポート資料(本、記事、活発なコミュニティなど)が豊富であるため、します。
2番目の質問に関しては、Haskellにはさまざまなライブラリがあります(ただし、一部は他よりも成熟しています)が、Scala(JVMで実行されるハイブリッドOO関数型言語)には、機能スタイルに徐々に移行できるという利点があります。 、そしてあなたはあなたが利用できるJavaアクセス可能なライブラリの全範囲を持っています。
事実上、PPで実行できることはすべてFPでも実行でき、逆の場合も同じです。これは、何かをコーディングするための別の方法です。問題に対する別の視点と、それを解決するための別の方法です。
ただし、FPを使用する人はそれほど多くないため、問題は、優れたライブラリの欠如、移植性/保守性(メンテナは、SchemeよりもC ++で記述されたものを理解する可能性が高いため)、およびドキュメントとコミュニティの欠如にあります。いくつかのドキュメントがあることは知っていますが、それをC ++、C#、またはJavaと比較すると、私が何を意味するのか理解できます。
ただし、本当にFPを実行したい場合は、C ++およびC#でもこのスタイルを使用できます。もちろん、標準ライブラリを使用する場合、100%FPにはなりません。残念ながら、C#が関数型プログラミングで使用するように最適化されているとは思わないため、パフォーマンスの問題が多数発生する可能性があります。
これはもっと主観的な投稿であり、私がFPについて考えていることです。厳密な宣言ではありません。
これはかなり主観的な質問ですが、関数型言語はドメイン固有言語の解析によく使用されることを付け加えたいと思います。機能的な性質は、文法の構文解析に適しています。
私が見たところ、それは機能性よりも味の問題です(しゃれは意図されていません)。特定のタスクで本質的に良くも悪くもする言語のスタイルについては、実際には何もありません。
一般に、問題の解決策を表現するのが最も簡単な言語を使用します。関数型プログラミングの場合、これは問題の解決策が関数の観点から簡単に表現される場合です。ため、この名前が付けられています。一般に、数学演算、AI、パターンマッチングに適しています。一般に、答えを得るために適用しなければならない一連のルールに分解できるものはすべて。問題を十分に分析して初めて、使用する「最適な」言語を実際に決定できます。これは、擬似コードが役立つところです。FPのような擬似コードを書いていることに気付いた場合は、FPを使用してください。
もちろん、すべての完全なプログラミング言語は機能的に同等であるため、解決できる問題に関して、どの言語を選択するかは実際には重要ではありません。主な効果は、コーディングの効率と精度、およびメンテナンスの容易さの観点からです。
また、巧妙に設計されたAPIを使用して、オブジェクト指向言語内でFPを模倣することが可能であることにも注意してください。たとえば、メソッドチェーンを使用してFP DSLをシミュレートする多数のJavaライブラリ(JMockはその一例です)を見てきました。次に、次のような構成が表示されます。
logger.expects(once()).method("error")
.with( and(stringContains(action),stringContains(cause)) );
これは基本的に、モックオブジェクトの呼び出しシーケンスが正しいかどうかを判断するために評価される関数を構築します。(http://www.jmock.org/yoga.htmlから盗まれた例)
他のオブジェクト指向言語でのもう1つのFPに似た構文は、Rubyなどのクロージャの使用です。