web-dev-qa-db-ja.com

関数型プログラミングの引数

私は最近、F#を楽しみに学んでいます(私はVB.NET/C#の開発者です)。F#が提供する機能のいくつかが本当に好きです。理論的にはそうです。しかし、C#ではなくF#でコーディングすることを選択するシナリオを考えるのに苦労しています。何か案は?

10
System Down

純粋な関数型プログラミングのいくつかの引数:

  • 今日のマルチコアシステムのタスクを分割する方が簡単です
  • プログラムが正しいことを証明する方が簡単です
  • 機能的な構成は、驚くほど簡潔で強力な場合があります

完全な扱いについては、 関数型プログラミングが重要である理由 および 関数型プログラミングがなぜ重要であるか を参照してください。

14
Scant Roger

C#ではなくF#でコーディングすることを選択するシナリオを考えるのに問題があります。何か案は?

から ここ

非同期サーバー

  • 非同期IOの非同期ワークフロー。
  • スレッドセーフメッセージパッシング用のメールボックスプロセッサ。
  • サーバー状態とメッセージカタログのユニオンタイプ。
  • ステートマシンのパターンマッチングとテール再帰。

メタプログラミング(例:解析)

  • Fslexやfsyaccなどのパーサージェネレーター。
  • FParsecのようなパーサーコンビネーター。
  • エレガントな手巻きパーサーのアクティブパターン。
  • 解析ツリーを表す代数的データ型。
  • ツリーを操作するためのパターンマッチング。最適化ステージを適用します。
  • 実行時の高速コード生成のためのリフレクション。

テクニカルコンピューティング

  • エレガントで高速なアルゴリズムコード用の高次関数。
  • シンボリック操作のための代数的データ型とパターンマッチング。
  • 豊富な.NETライブラリの相互運用性。
  • F#インタラクティブを使用した対話性。
  • データをマッサージするための計算式。
  • 正確さを改善するための測定単位。

GUIアプリケーション

  • ユーザーインターフェイスコードとアプリケーションロジックコード間の非同期メッセージ受け渡しとしてモデル化します。
  • 高階関数を使用すると、ユーザーインターフェイスを宣言的に定義できます。

論理プログラミング

  • 簡単なバックトラッキングのための永続的なコレクション。
  • テールには信頼性が必要です。
  • 簡単な汎用プログラミングのための自動一般化。

テスト中

  • 単体テストをインタラクティブに実行します。
  • BDDはインタープリターを書くことを意味します。
  • テストハーネスを記述し、結果を視覚化するための優れたスクリプト言語。

パフォーマンス

  • inlineは無料の高次抽象化です。
  • テールステートマシンの高速化が必要です。
  • 低レイテンシのための純粋に機能的なデータ構造。
  • 最適化されたコードを生成するためのメタプログラミング。
6
Jon Harrop

ここでは、関数型プログラミングを多かれ少なかれ毎日使用しています。

かなり大きなデータセットを使用して、多くの統計的および保険数理的なことを行っています。データベースからフェッチされるデータは、本質的に静的で不変のオブジェクトです。メソッドを持つクラスを作成する理由はありません。

計算の各段階で詳細が追加されますが、基本的にオブジェクトは変化しません。パイプラインの「終わり」では、合計やカウントなどを計算するために、実際には大幅な削減を行っています。

これを想像してみてください。

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

計算の各「フェーズ」は、関数型プログラミングループであり、単純な読み取り-計算-利回りを実行し、他のものと結果の複合オブジェクトを作成します。

(Pythonを使用しているため、ジェネレーター関数を使用した関数型プログラミングです。)

ステートレスで不変のオブジェクトを使用する方が簡単です。

5
S.Lott

技術的には、これは関数型プログラミングに固有のプロパティではなく、F#は純粋な関数型言語ではありません。 F#は、MLの子孫の1つとして、優れたパターンマッチングと代数的データ型を提供します。したがって、複雑なデータ構造を必要とするタスクでは、C#よりもF#の方が表現力があり、使いやすいです。

C#とF#でコンパイラーを実装することを想像してみてください-言語がADTとパターンマッチングを提供している場合、抽象構文ツリーを表現し、それを変換するのははるかに簡単です。

4
SK-logic

Map-reduceのような大規模なマルチシステムや大規模なマルチコア並列処理に最適です。最近のエントリーレベルのサーバーには48コア(96カウントはHT)が付属していることを考えると、かなりクールです。

2
vartec

完全に機能するHaskellを試してみたい場合は、Erlangにも非常に優れた機能があります。

Simon Payton-JonesはHaskellについて語り、明らかなバグではなく、明らかにバグのないプログラムを望んでいます。

(私はおそらく少し引用を外しましたが、あなたはアイデアを理解します)

副作用を制限することで、コードが正しいことを証明しやすくなります。

2
Zachary K

明確な利点の1つは、より簡単に並列化できることです。

1
biziclop