私は最近、F#を楽しみに学んでいます(私はVB.NET/C#の開発者です)。F#が提供する機能のいくつかが本当に好きです。理論的にはそうです。しかし、C#ではなくF#でコーディングすることを選択するシナリオを考えるのに苦労しています。何か案は?
純粋な関数型プログラミングのいくつかの引数:
完全な扱いについては、 関数型プログラミングが重要である理由 および 関数型プログラミングがなぜ重要であるか を参照してください。
C#ではなくF#でコーディングすることを選択するシナリオを考えるのに問題があります。何か案は?
から ここ :
非同期サーバー
メタプログラミング(例:解析)
テクニカルコンピューティング
GUIアプリケーション
論理プログラミング
テスト中
パフォーマンス
inline
は無料の高次抽象化です。ここでは、関数型プログラミングを多かれ少なかれ毎日使用しています。
かなり大きなデータセットを使用して、多くの統計的および保険数理的なことを行っています。データベースからフェッチされるデータは、本質的に静的で不変のオブジェクトです。メソッドを持つクラスを作成する理由はありません。
計算の各段階で詳細が追加されますが、基本的にオブジェクトは変化しません。パイプラインの「終わり」では、合計やカウントなどを計算するために、実際には大幅な削減を行っています。
これを想像してみてください。
for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
print data
計算の各「フェーズ」は、関数型プログラミングループであり、単純な読み取り-計算-利回りを実行し、他のものと結果の複合オブジェクトを作成します。
(Pythonを使用しているため、ジェネレーター関数を使用した関数型プログラミングです。)
ステートレスで不変のオブジェクトを使用する方が簡単です。
技術的には、これは関数型プログラミングに固有のプロパティではなく、F#は純粋な関数型言語ではありません。 F#は、MLの子孫の1つとして、優れたパターンマッチングと代数的データ型を提供します。したがって、複雑なデータ構造を必要とするタスクでは、C#よりもF#の方が表現力があり、使いやすいです。
C#とF#でコンパイラーを実装することを想像してみてください-言語がADTとパターンマッチングを提供している場合、抽象構文ツリーを表現し、それを変換するのははるかに簡単です。
Map-reduceのような大規模なマルチシステムや大規模なマルチコア並列処理に最適です。最近のエントリーレベルのサーバーには48コア(96カウントはHT)が付属していることを考えると、かなりクールです。
完全に機能するHaskellを試してみたい場合は、Erlangにも非常に優れた機能があります。
Simon Payton-JonesはHaskellについて語り、明らかなバグではなく、明らかにバグのないプログラムを望んでいます。
(私はおそらく少し引用を外しましたが、あなたはアイデアを理解します)
副作用を制限することで、コードが正しいことを証明しやすくなります。
明確な利点の1つは、より簡単に並列化できることです。