カリー化でググると多数の解説記事がでてきます。
ということは、それなりに便利なテクニックなのかな?と思うのですが、どのサイトを見てもカリー化のメリットがよく分かりません。
どうも部分適用(一部の引数を固定した関数を変数に設定する)する際に、一度カリー化することが多いようですが、カリー化せずに直接部分適用した方が簡単で良いと思うのですよ。
カリー化の実用面でのメリットってあるのでしょうか?
(あ、部分適用のメリットは理解してます。汎用な関数を様々なケース向けに限定して使いたい時など重宝します。)
私はC++erなのでC++14によるカリー化を見つけました。
C++14の強化されたラムダ式と戻り値の型推論を使えば、カリー化する関数テンプレートを簡単に作れるようです。
これを使って、add()関数をカリー化して部分適用する簡単なサンプルを作ってみました。
C++
1#include <iostream> 2// curry()はhttp://notmoon.hateblo.jp/entry/2015/08/05/115525からの引用 3template<typename F> 4auto curry(F f) 5{ 6 return [f](auto a){return [f, a](auto... args){return f(a, args...);};}; 7} 8int add(int x, int y) 9{ 10 return x+y; 11} 12int main() 13{ 14 auto add1c = curry(add)(10); 15 std::cout << add1c(20) << "\n"; 16}
でも、下記のようにカリー化せずに部分適用することもできます。
こちらの方が直接的で分かりやすくないでしょうか?
C++
1#include <iostream> 2template<typename F, typename T> 3auto partial(F f, T a) 4{ 5 return [f, a](auto... args){return f(a, args...);}; 6} 7int add(int x, int y) 8{ 9 return x+y; 10} 11int main() 12{ 13 auto add1p = partial(add, 10); 14 std::cout << add1p(20) << "\n"; 15}
両方共、msvc2015とMinGW 4.9.2(-std=c++14オプション)で動作確認しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/10 07:31
2015/11/10 07:47
2015/11/10 08:54
2015/11/10 10:58
2015/11/10 12:55
2019/04/04 09:42 編集