【かりーか】
カリー化 とは?
最終更新:
💡 引数を「一度に全部」ではなく「1つずつ」渡す、関数の分割払い
複数の引数を取る関数を、引数を1つずつ受け取る関数の連鎖に変換するテクニック。関数型プログラミングの基本概念の一つです。
📌 このページのポイント
- 複数引数の関数を、1引数の関数が次の関数を返す形に変換する
- 一部の引数だけ先に渡す「部分適用」に使えるが、両者は別の操作
- Haskellはカリー化された関数を扱い、Scalaにはcurriedなどの変換がある
- JavaScriptやTypeScriptでもクロージャを使って実装できる
カリー化って料理のカレーと関係あるの?
数学者ハスケル・カリーの名前に由来するよ。たとえばadd(a, b)のように二つの引数を一度に受け取る関数を、add(a)(b)のように一つずつ受け取る形へ変換することなんだ。
最初のadd(a)は何を返すの?
残りの引数bを受け取る関数だよ。JavaScriptなら「const add = a => b => a + b」と書ける。add(5)は、あとから受け取る値に5を足す関数を返すんだ。
それを保存して再利用できるの?
うん。「const addFive = add(5)」としておくと、addFive(3)は8、addFive(10)は15になる。このように一部の引数を渡して残りを受け取る関数を得る操作が「部分適用」だよ。
どの言語でも同じ書き方なの?
じゃあ、カリー化と部分適用の違いは?
カリー化は関数の引数の受け取り方を変えること、部分適用は具体的な引数を先に固定することだよ。部分適用には必ずしもカリー化は必要ない。JavaScriptのbindでも、普通の複数引数の関数に最初の引数を固定できる。カリー化を元の形へ戻す操作は「アンカリー化」と呼ぶよ。
まとめ:ざっくりこれだけ覚えればOK!
「カリー化」って出てきたら「引数を1つずつ渡せるように関数を変換すること」と思えればだいたいOK!
📖 おまけ:英語の意味
「Currying」 = カリー化
💬 数学者ハスケル・カリーの名前に由来するよ。ちなみにプログラミング言語Haskellも同じ人の名前から来ているんだ