2011-07-06 6 views

答えて

4

関連する質問はカバーとして、Practical use of curried functions?、そこには多くの理由がなぜ人々値カリー化であり、それを利用して、含む:コードの再利用を向上

  • は - 特殊なケースの機能は、単に部分的に適用されている(とカレー風味コードの可読性を向上させること)汎用関数
  • からmap (+2)map (\x -> x + 2)
  • パフォーマンスの向上よりも読みやすい - カリー化は明らかに、特定の専門分野を作ることができ、そして良いコンパイラは
  • 0に特化したバージョンを生成します。
  • 楽しい - よりシンプルなコードは、より美しいコードにより人生を楽しくします。
2

真のメリット、私が発見した:

  • バグも少ない - 関数合成でコードを構成することは絶対に必要な制御フローよりも、正しいコードになる傾向があります。あなたが使用している場合たとえば、あなたは多くの「オフずつ」インデックスエラー

    のリスクを排除ではなく「ループの」よりも「マップ」
  • より良い並行処理 - あなたは純粋な、副作用free関数で作成したコード自動的にスレッドセーフです。これを永続的な永続的なデータ構造と組み合わせると、強力な並行コードを作成するための優れたレシピがあります。 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

  • より簡潔かつ管理コードを参照してください - - 機能コードが不可欠OOPコードよりもかなり短いことが、私の完全に非科学的分析に思わClojureのは、このために特に良いです。プログラムが大きくなるにつれて、利益はより顕著になる傾向があります。私は、これにはいくつかの理由があると思います:

    • 機能的な言語の構文はかなり簡潔になる傾向があります。例えば、Haskellと様々なLispsは、どちらも非常にシンプルで洗練された構文を持っています。
    • 機能言語は、プログラムの部分をまとめて貼り合わせるのではなく(高次関数の)合成を促す傾向があります。したがって、他の多くのパラダイムに内在する多くの定型文を避けることができます。
    • 構成のポイントに関連して、DRYの原則を関数型言語に適用する方が簡単だとわかりました。共通のパターンが見える場合は、他の場所で使用できるように、これをかなり高次の関数(または、あなたがLisperならマクロ)にかなり簡単に抽出することが可能です。
  • テスタビリティ - あなたは主に、純粋な関数でコードを書くとき、それは堅牢なテストを書くのは非常に簡単です。

もちろんこれをofsetするためにいくつかの欠点があります。

  • それはを書くために難しいです - あなたはあなたの頭の中ではかなり複雑な抽象的な概念を保持する必要があるので、あなたはより多くの精神的な敏捷性を必要とします。あなたが訓練された数学者(私)ですが、OOPよりも機能的なコードを書いているのが分かります。
  • パフォーマンスオーバーヘッドがあります - 関数型言語は、必然的にある程度のオーバーヘッドを意味するさまざまな構文を使用します。これは良いコンパイラではかなり小さくすることができますが、完全に排除することはできません。
  • ライブラリ/ツールsuport - これはほぼ完全にOOPプラットフォームとツールの成熟度が高いためですが、依然として問題です。長期的にはこれは問題ではありませんが、私が見つけた最良の解決策は、Clojureを使用することです。これはJavaプラットフォームのライブラリとツールを最大限に活用することができます。
+1

ああ私は質問を間違って読んで、「関数型プログラミングの価値は何ですか?」のように答えました。うわー! – mikera

1

私はそれは私が自分自身がそのような

configure_grid (grid, first_column, last_column, action) { 
    for (i = first_column; i <= last_column; ++i) 
     // ... 
} 

configure_grids (action) { 
    congifure_grid (alpha, first_alpha, last_alpha, action); 
    congifure_grid (beta, first_beta, last_beta, action); 
} 

代わりのアルファとベータのそれぞれに対して一度forループ書き込みなどのコードを書く見つける++ C/CではビットOnce and Only Once

ようなものだと言うだろう。これは手続き型コードをカリングすることと似ています。ここの利点は明らかです。

カリングは重要な理論的概念ですが、実用的なという用語では、これが利点です。

実際には、私はそれは少し、このようなものだった、一度Cでテストスイートを書いて覚えている:これは、すべての純粋なC、ノーマクロ策略などの機能スタイルや種類のようにあった

typedef bool (*predicate) (const type *); 

const char * argument; 

bool do_foo (const type * t) { 
    return bar (t, argument); 
} 

bool do_baz (const type * t) { 
    return bap (t, argument); 
} 

predicate foo (const char * arg) { 
    argument = arg; 
    return do_foo; 
} 

predicate baz (const char * arg) { 
    argument = arg; 
    return do_baz; 
} 

assert (for_all (data_set("alpha"), foo ("abc"))); 
assert (for_all (data_set("beta"), baz ("def"))); 

カレー。ここでの利点は、テストケースが何であるかを一目で確認できることです。 data_setは似ています - それはデータをフェッチする別の関数に引数をバインドします:for_allはサンクを実行し、述語をチェックしてクリーンアップします。きちんとした

関連する問題