私はコンセプトとカリングの使い方を知っていますが、実際にその価値は何ですか?Functional Programmingのカリングの価値は何ですか?
答えて
関連する質問はカバーとして、Practical use of curried functions?、そこには多くの理由がなぜ人々値カリー化であり、それを利用して、含む:コードの再利用を向上
- は - 特殊なケースの機能は、単に部分的に適用されている(とカレー風味コードの可読性を向上させること)汎用関数
- から
map (+2)
map (\x -> x + 2)
- パフォーマンスの向上よりも読みやすい - カリー化は明らかに、特定の専門分野を作ることができ、そして良いコンパイラは 0に特化したバージョンを生成します。
- 楽しい - よりシンプルなコードは、より美しいコードにより人生を楽しくします。
真のメリット、私が発見した:
バグも少ない - 関数合成でコードを構成することは絶対に必要な制御フローよりも、正しいコードになる傾向があります。あなたが使用している場合たとえば、あなたは多くの「オフずつ」インデックスエラー
のリスクを排除ではなく「ループの」よりも「マップ」より良い並行処理 - あなたは純粋な、副作用free関数で作成したコード自動的にスレッドセーフです。これを永続的な永続的なデータ構造と組み合わせると、強力な並行コードを作成するための優れたレシピがあります。 http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
より簡潔かつ管理コードを参照してください - - 機能コードが不可欠OOPコードよりもかなり短いことが、私の完全に非科学的分析に思わClojureのは、このために特に良いです。プログラムが大きくなるにつれて、利益はより顕著になる傾向があります。私は、これにはいくつかの理由があると思います:
- 機能的な言語の構文はかなり簡潔になる傾向があります。例えば、Haskellと様々なLispsは、どちらも非常にシンプルで洗練された構文を持っています。
- 機能言語は、プログラムの部分をまとめて貼り合わせるのではなく(高次関数の)合成を促す傾向があります。したがって、他の多くのパラダイムに内在する多くの定型文を避けることができます。
- 構成のポイントに関連して、DRYの原則を関数型言語に適用する方が簡単だとわかりました。共通のパターンが見える場合は、他の場所で使用できるように、これをかなり高次の関数(または、あなたがLisperならマクロ)にかなり簡単に抽出することが可能です。
テスタビリティ - あなたは主に、純粋な関数でコードを書くとき、それは堅牢なテストを書くのは非常に簡単です。
もちろんこれをofsetするためにいくつかの欠点があります。
- それはを書くために難しいです - あなたはあなたの頭の中ではかなり複雑な抽象的な概念を保持する必要があるので、あなたはより多くの精神的な敏捷性を必要とします。あなたが訓練された数学者(私)ですが、OOPよりも機能的なコードを書いているのが分かります。
- パフォーマンスオーバーヘッドがあります - 関数型言語は、必然的にある程度のオーバーヘッドを意味するさまざまな構文を使用します。これは良いコンパイラではかなり小さくすることができますが、完全に排除することはできません。
- ライブラリ/ツールsuport - これはほぼ完全にOOPプラットフォームとツールの成熟度が高いためですが、依然として問題です。長期的にはこれは問題ではありませんが、私が見つけた最良の解決策は、Clojureを使用することです。これはJavaプラットフォームのライブラリとツールを最大限に活用することができます。
ああ私は質問を間違って読んで、「関数型プログラミングの価値は何ですか?」のように答えました。うわー! – mikera
私はそれは私が自分自身がそのような
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
はサンクを実行し、述語をチェックしてクリーンアップします。きちんとした
- 1. Functional Programmingのポイントフリースタイルとは何ですか?
- 2. Functional Programmingのカスタムサイン関数
- 3. PythonのFunctional Reactive Programmingのステータスはどうですか?
- 4. Functional Programmingのパラダイムで2つの関数をマップする
- 5. Functional Reactive Programmingをデモするために書かれたPythonライブラリとは何ですか?
- 6. MapやReduceのような概念はすべてのFunctional Programming Languagesに適用されますか?
- 7. 「Programming Collective Intelligence」のピアソンアルゴリズムの問題点は何ですか?
- 8. Railsアプリケーション用のHTML5ボイラープレートの価値は何ですか?
- 9. ラムダ関数でカリングを使用できますか?
- 10. 返品とは何ですか? (価値のない)意味ですか?
- 11. android:sharedUserLabelとは何ですか?android:sharedUserIDの上に追加された付加価値は何ですか?
- 12. NSNumberに保存できる最大の価値は何ですか?
- 13. Functional Dependency Reduction
- 14. Yii functional testing
- 15. Androidオープンループ2dカリング
- 16. Objective C Programmingでより好ましい幾何学はどれですか?
- 17. 配管、合成、カリング
- 18. のGet価値のXSLで、
- 19. は、同じDIVで何度も価値を持ち、割り当てますか?
- 20. カリングはアニメーションに影響します
- 21. この評価の目的は何ですか?
- 22. ラムダ式のSQL WHEREの等価性は何ですか?
- 23. オブジェクトのカリングを無効にする
- 24. Prolog Programming
- 25. Arduino programming
- 26. Yahooの価値はそれほど高いのですか?
- 27. カスタムメンバーシッププロバイダは、本当に価値のあるものですか?
- 28. Azure帯域幅の価格設定とは何ですか?
- 29. 良い、手頃な価格の "ノブ"ライブラリは何ですか?
- 30. GCCの高価な最適化とは何ですか?
「カリー化関数の実用化」(http://stackoverflow.com/q/4888480/298282)も参照してください。 –