関数型プログラミングの引数[終了]


10

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


2
F#関数型プログラミングを完全に表すものではありません。Clojure代わりに試してください。
仕事

1
F#はわかりませんが、Haskellは心が痛むときはいつでも使用します。これまで毎回働いていました;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickeyは、このトピックに関する優れたビデオです(OO対機能的)
mikera

動的関数型言語ですか?いくつでも持つことができます。:P
エリック・レッペン、2013年

回答:


14

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

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

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


6

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

ここから:

非同期サーバー

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

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

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

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

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

GUIアプリケーション

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

論理プログラミング

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

テスト中

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

パフォーマンス

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

私はF#やC#がわからないことを認めますが、F#で数日間過ごし、あなたの考えを見てみることをお勧めします。私の心にREPLを使用すると、サポートしていることをどの言語でも大きな勝利だ
ザカリーK

5

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

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

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

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

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

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

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

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


PythonにはこのF#と同等のものはありますか?criteria() |> some_query |> calculate |> enrich |> summarize前方パイプ演算子はより明確なコードにつながる可能性があると思いますが、余談です。
ChaosPandion

@ChaosPandion:まず、その構文は私を混乱させます。しかし、それを好む人もいるようです。無数のPythonパッケージがあります。SOで検索して答えを見つけることができると思います。
S.Lott

@カオス:私が知っていることではありません。通常、私mapは同じ効果を得るために作曲します。
ポールネイサン

4

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

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


2

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


2

完全に機能したい場合はHaskellを試してみてください。Erlangにもいくつかの非常に優れた機能があります。

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

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

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


1

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


2
純粋さについて話していますが、明らかな欠点の1つは、純粋さによってプログラムが大幅に遅くなる傾向があることです。したがって、parallel + pureは必ずしも良いことではありません。
Jon Harrop、2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.