カリー化とは
カリー化とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。
文字だけでは全然わからないと思うのでコードで解説します。
下記のように引数を2つ受け取る関数があるとします。
sample(arg1, arg2) {
console.log(`引数1:${arg1}, 引数2:${arg2}`)
};
sample('りんご', 'ぶどう');
// => 引数1:りんご, 引数2:ぶどう
これはみんなおなじみの普通の関数。
sample
という名前で関数を定義し、arg1
とarg2
という二つの引数をとっています。
このときに、引数1だけを固定して、引数2だけを変えて何回かこの関数を呼び出したい場合、上記のままだとこうなります。
sample('りんご', 'ぶどう');
sample('りんご', 'スイカ');
sample('りんご', 'ドラゴンフルーツ');
なんか冗長ですよね、、、
1つ目の引数のりんご
を何回も呼び出すのがなんか気持ち悪い、、
具体例が下手くそすぎて申し訳ないのですが、
このように一部の引数を固定して、残りの引数を動的に変更させたい場合、カリー化が役に立ちます。
// 普通の関数
sample(arg1, arg2) {
return `引数1:${arg1}, 引数2:${arg2}`
};
// カリー化
curryingSample(arg1) {
return (arg2) => {
console.log(`引数1:${arg1}, 引数2:${arg2}`);
}
};
const fixedAppleFunc = curryingSample('りんご');
fixedAppleFunc('ぶどう');
// => 引数1:りんご, 引数2:ぶどう
fixedAppleFunc('スイカ');
// => 引数1:りんご, 引数2:スイカ
fixedAppleFunc('ドラゴンフルーツ');
// => 引数1:りんご, 引数2:ドラゴンフルーツ
ここでもう一度最初の説明文を載せます。
カリー化とは、複数の引数をとる関数(
sample()
)を、引数が「もとの関数の最初の引数(arg1
)」で戻り値が「もとの関数の残りの引数(arg2
)を取り結果を返す関数(curryingSample()内でreturnされているアロー関数
)」であるような関数(curryingSample()
)にすること(あるいはその関数のこと)である。
本当に具体例が下手すぎて恐縮なんですが、最初よりは理解が深まったと思います笑
おまけ
自分が実際に実務でこのカリー化を使った時は、map()
で指定するコールバック関数にこのカリー化した関数を使いました。
curryingFunc(arg1, arg2) {
return (arg3) => {
// 処理
}
};
const fixedArgumentsFunc = curryingFunc('固定したい引数1', '固定したい引数2')
const results = array.map(fixedArgumentsFunc);
こんな感じで、map()
で回す値だけを動的に変えたいときに使いました