【かりーか】

カリー化 とは?

最終更新:
💡 引数を「一度に全部」ではなく「1つずつ」渡す、関数の分割払い

複数の引数を取る関数を、引数を1つずつ受け取る関数の連鎖に変換するテクニック。関数型プログラミングの基本概念の一つです。

📌 このページのポイント
カリー化と、その後の部分適用 変換前add(a, b)カリー化後add(a)(b)変換5を先に渡す(部分適用)add(5)返る関数をaddFiveとするb => 5 + baddFive(3) = 8addFive(10) = 15
add(5)は答えの数値ではなく、残りの引数を受け取る関数を返す。
ひよこ ひよこ
カリー化って料理のカレーと関係あるの?
ペンギン先生 ペンギン先生
数学者ハスケル・カリーの名前に由来するよ。たとえば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になる。このように一部の引数を渡して残りを受け取る関数を得る操作が「部分適用」だよ。
ひよこ ひよこ
どの言語でも同じ書き方なの?
ペンギン先生 ペンギン先生
書き方や機能は言語ごとに違うよ。Haskellではカリー化された関数が基本で、二つの値をまとめたタプルを受け取る形も使える。Scalaにはcurriedによる変換があるけれど、複数の引数リストを持つメソッドとは区別するんだ。
ひよこ ひよこ
じゃあ、カリー化と部分適用の違いは?
ペンギン先生 ペンギン先生
カリー化は関数の引数の受け取り方を変えること、部分適用は具体的な引数を先に固定することだよ。部分適用には必ずしもカリー化は必要ない。JavaScriptのbindでも、普通の複数引数の関数に最初の引数を固定できる。カリー化を元の形へ戻す操作は「アンカリー化」と呼ぶよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カリー化」って出てきたら「引数を1つずつ渡せるように関数を変換すること」と思えればだいたいOK!
📖 おまけ:英語の意味
「Currying」 = カリー化
💬 数学者ハスケル・カリーの名前に由来するよ。ちなみにプログラミング言語Haskellも同じ人の名前から来ているんだ

参考資料

← 用語集にもどる