**カリー化(Currying)**は、N 個の引数を取る関数を、それぞれ1つの引数を取る N 個の関数の連鎖に変換します。**部分適用(Partial application)**は、一部の引数を今固定し、残りを待つ関数を返します。
js
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
**カリー化(Currying)**は、N 個の引数を取る関数を、それぞれ1つの引数を取る N 個の関数の連鎖に変換します。**部分適用(Partial application)**は、一部の引数を今固定し、残りを待つ関数を返します。
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
各ステップはクロージャを使って、すべての引数が揃うまで以前の引数を記憶しています。
const log = level => message => console.log(`[${level}] ${message}`);
const error = log("ERROR"); // reusable, pre-configured logger
const info = log("INFO");
error("disk full"); // [ERROR] disk full
レベルをあちこちで繰り返す代わりに、設定済みの関数を一度だけ作ります。これは関数型のパイプラインやイベントハンドラで真価を発揮します。
const onChange = field => e => setForm(f => ({ ...f, [field]: e.target.value }));
<input onChange={onChange("email")} /> // a handler specialized to "email"
ライブラリ(Ramda、lodash の curry)は任意の関数を自動でカリー化し、引数を柔軟なグループで渡せるようにします。
カリー化は、クリーンな関数合成、再利用可能な設定済みコールバック、ポイントフリースタイルを可能にします。
関数型のコードベースでよく使われ、クロージャの理解を試すための頻出の面接トピックでもあります。