どうも、michikusamichiyaから名前を変えてExploder.exeになった者です。
今回は
カリー化を30秒で
メリット/デメリットを15秒で
理解します。ただし、今回理解するためには
- アロー関数についての知識
- JavaScriptの知識 (Pythonでもギリギリ可)
が必要です。ということでやっていきましょう。
結局カリー化とは
引数が2つ以上ある関数
func(a, b)
とかを、
func(a)(b)
のように分解することです。
関数の返り値は関数
分解すると
(func(a))(b)
です。よく見ると、
func(a)という関数が関数を返しているように見えます。
func(a)は「関数を返す」ので、
その返ってきた関数に(b)を渡している。
ということは
const func = a => {
return (何かの関数);
};
というわけです。そしてこの「何かの関数」には$b$を取る関数を返せばいいのです。
const func = a => {
return (b) => {
// 何かの処理
}
}
そしてreturnは無くてもOKなので、
const func = a => b => {
// 何かの処理
}
という風にまとまるわけです。
例
関数$f(a)(b)=a+b$を作ってみましょう。普通は
const f = (a, b) => a + b;
ですが、こいつをカリー化したいと思います。
const f = a => "(bを受け取って、a+bを返す関数)"
で、それはb => a + bなので、
const f = a => b => a + b;
です。意外と簡単でしょ?
実際に使うと、
f(2)(3) // 5
のようになります。
カリー化のメリット
何よりも部分適用と言って、引数部の一部を省略できるようになることがある、という点です。
例えば上で出した$f(a)(b)=a+b$の関数、$a=1$と固定したいとき、普通の関数だと原則第二引数を指定するなら第一引数は省略できないので、f(1,b)とか書かないといけませんが、g = f(1)と置いてg(b)と書けば実質f(1)(b)と同じ意味になるから、場合によっては便利になります。
const add1 = f(1);
add1(5) // 6
add1(10) // 11
カリー化のデメリット
可読性が下がります
const f = a => b => a + b;
普通に考えてカリー化知らない人が読んだら「は?」ってなります。そもそも感覚的にカリー化使うことあんまりないし...
まとめ
結局カリー化とは
- 関数を返す関数を作って、引数を分解する
ことです。
ここまで読んでいただきありがとうございました。