カリー化手法とは何かについてのドキュメントや質問はたくさんありますが、実際にカリー化を使用する理由についての情報はほとんど見つかりませんでした。私の質問は、カリー化の利点は何ですか? おそらく、従来のメソッド呼び出しよりもカリー化の方が望ましい簡単な例を提供できます。
私は太陽が昇っている間は C++ で作業しているので、これまでのところ、仕事以外で言語をいじる以外にカレーに触れる機会はほとんどありませんでした。
カリー化手法とは何かについてのドキュメントや質問はたくさんありますが、実際にカリー化を使用する理由についての情報はほとんど見つかりませんでした。私の質問は、カリー化の利点は何ですか? おそらく、従来のメソッド呼び出しよりもカリー化の方が望ましい簡単な例を提供できます。
私は太陽が昇っている間は C++ で作業しているので、これまでのところ、仕事以外で言語をいじる以外にカレーに触れる機会はほとんどありませんでした。
まず、部分関数の適用をカリー化と間違えることはよくあることです。たとえば、これを参照してください(それを説明するより良いリソースがあると確信していますが、これは私が見つけた最初のものでした)。実際にカリー化を使用している人を見たことはほとんどありません (すべての関数が言語自体によってカリー化されている Haskell のような言語を除きますが、それは単純な部分関数適用を可能にするためです)。一方、部分関数適用は多くの言語で非常に便利です。
とにかく、部分関数適用について話していると仮定すると (ほとんどの人がカリー化について尋ねるとき、それについて話しているため)、概念は C++ では Haskell などの (純粋な) 関数型言語ほど自然ではありません。例えば。
たとえば、ここではsum
、数値の配列を取り、list
すべての数値を合計する関数を定義します。フォールドの概念 (または、reduce または inject と呼ばれることもある) に慣れていない場合は、このをお読みください。とにかく、次のようになります。
sum list = foldl (+) 0 list
しかし、ちょっと待ってください。部分関数適用で短縮できました!sum
引数を指定する代わりに、+ と 0 が部分的に適用された、foldl と等しい関数であるとだけ言います。
sum = foldl (+) 0
どちらが読みやすいですか?おそらく好みの問題ですが、私の意見では、後者の方が sum と foldl の関係をより明確に強調しています。これは非常に単純な例であることを考慮してください。正直なところ、C++ で良い例を書く方法がわからないので、失礼します。いずれにせよ、実際の利点は何ですか?読みやすさ。より明確な意図。より短いコード。
免責事項: (部分関数適用とは対照的に) カリー化の利点を実際に知りたい場合は、これをすべて読んで申し訳ありません。しかし一方で、この 2 つの違いを理解すれば、カリー化が部分的な関数適用を実装する優れた方法であることも理解できます。