【かりーか】

カリー化 とは?

💡 引数を「一度に全部」ではなく「1つずつ」渡す、関数の分割払い
📌 このページのポイント
カリー化: 複数引数 → 1引数ずつの連鎖 通常の関数 add(a, b) 引数を一度にまとめて渡す カリー化 カリー化後 add(a)(b) 引数を1つずつ渡す 部分適用の活用例 add(5) 「5を足す関数」を生成 addFive 再利用できる! addFive(3) → 8 addFive(10) → 15 addFive(20) → 25 実用例: log("ERROR") → errorLog関数 / multiply(1.1) → 税込計算関数
カリー化と部分適用のイメージ
ひよこ ひよこ

カリー化って料理のカレーと関係あるの?

ペンギン先生 ペンギン先生

残念ながら食べ物とは無関係だよ(笑)。数学者のハスケル・カリーさんの名前が由来なんだ。カリー化とは、たとえば add(a, b) のように2つの引数を一度に受け取る関数を、add(a)(b) のように1つずつ受け取る形に変換することだよ。

ひよこ ひよこ

わざわざ1つずつにする意味ってあるの?

ペンギン先生 ペンギン先生

大きなメリットは「部分適用」ができること。たとえば add(a)(b) をカリー化しておけば、add(5) と書くだけで「5を足す関数」が作れる。これを addFive として保存しておけば、addFive(3) で8、addFive(10) で15、と再利用できるんだ。

ひよこ ひよこ

なるほど、設定を途中まで済ませた関数を作っておけるんだね!

ペンギン先生 ペンギン先生

そのとおり!実際の開発でも便利で、たとえばログ関数 log(level)(message) をカリー化しておくと、errorLog = log('ERROR') で「エラーログ専用関数」を作れる。設定値を事前に埋め込んだ専用関数を量産できるのがカリー化の強みだよ。

ひよこ ひよこ

どの言語で使えるの?

ペンギン先生 ペンギン先生

Haskellではすべての関数が自動的にカリー化されているし、ScalaやF#にも組み込みのサポートがあるよ。JavaScriptPythonではクロージャを使って手動でカリー化するか、Lodashなどのライブラリを使うのが一般的だね。

ひよこ ひよこ

カリー化と部分適用って同じものじゃないの?

ペンギン先生 ペンギン先生

よく混同されるけど厳密には違うよ。カリー化は「n引数の関数を1引数関数のチェーンに変換する」こと。部分適用は「一部の引数を固定して新しい関数を作る」こと。カリー化された関数は自然に部分適用できるから関係は深いけど、部分適用はカリー化しなくてもできるんだ。数学的にはカリー化は同型射(isomorphism)で、元に戻す操作を「アンカリー化」と呼ぶよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カリー化」って出てきたら「引数を1つずつ渡せるように関数を変換すること」と思えればだいたいOK!
📖 おまけ:英語の意味
「Currying」 = カリー化
💬 数学者ハスケル・カリーの名前に由来するよ。ちなみにプログラミング言語Haskellも同じ人の名前から来ているんだ
← 用語集にもどる