以前JavaScriptの学習をしていた際、
カリー化
というワードが出てきました。
初めは見間違いかと思い、日頃からスパイスカレーを食べすぎて
ついに目もカレーに侵食されたかと2度見をしてもカリー化
と記載されていました。
初めて目にしたワード。
しかもカレー。
これは詳しく知りたいと思い、
今回まとめていきます。
カリー化とは
カリー化とは一体何でしょうか。
こちらのサイトに下記のように記載されていました。
カリー化は、関数を扱う際の上級テクニックです。これはJavaScriptだけでなく、他の言語でも使用されます。
カリー化はf(a, b, c)として呼び出せる関数をf(a)(b)(c)のように呼び出せるようにする、関数の変形のことを指します。
カリー化は関数を呼び出しません。ただ変形するだけです。
なるほど。
どのようなものかは理解できました。
では実際の例とメリット等をみていきましょう。
例
通常の関数は複数の引数を一度に受け取りますが、
カリー化された関数は引数を1つずつ受け取り、
そのたびに新しい関数を返します。
// 通常の関数
function add(a, b) {
return a + b;
}
console.log(add(2, 3)) // 5
// カリー化
function curriedAdd(a) {
return function(b) {
return a + b;
};
}
const add2 = curriedAdd(2)
console.log(add2(3)) // 5
console.log(curriedAdd(2)(3)) // 5
下記の例では、
カリー化を使用することでフィルタリングの条件を柔軟に設定できます。
function isInRange(min) {
return function(max) {
return function(value) {
return value >= min && value <= max;
};
};
}
const isTeenager = isInRange(13)(19); // 13-19の範囲をチェック
console.log(isTeenager(15)); // true
console.log(isTeenager(25)); // false
カリー化のメリット
カリー化には下記のようなメリットがあると思います。
①再利用性の向上
引数の一部を固定した関数を作成し、別の場所で使いまわすことができます。
function multiply(a) {
return function(b) {
return a * b;
};
}
const double = multiply(2); // 2倍にする関数
const triple = multiply(3); // 3倍にする関数
console.log([1, 2, 3].map(double)); // [2, 4, 6]
console.log([1, 2, 3].map(triple)); // [3, 6, 9]
②可読性と意図の明確化
大きな関数を部分的に分解し、処理を順序立てて書くことができます。
下記の例では、ドル記号を付与した値をフォーマットするという意図がより明確になります。
// 通常の関数
function formatCurrency(amount, symbol) {
return `${symbol}${amount}`;
}
console.log(formatCurrency(100, "$")); // $100
// カリー化された関数
function curriedFormatCurrency(symbol) {
return function(amount) {
return `${symbol}${amount}`;
};
}
const formatUSD = curriedFormatCurrency("$");
console.log(formatUSD(100)); // $100
③関数型プログラミングに適合
関数型プログラミングでは、状態の変更を避け、
関数間での副作用を減らすことが推奨されています。
カリー化を使うと、状態を持たない関数を作りやすくなります。
終わりに
今回はカリー化の技術について学びました。
実務でも使用できそうな技術のため、
機会があれば積極的に使用したいと思います。
ちなみにカリー化の由来は、
論理学者のハスケル・カリーだそうです。
食べ物じゃなかったんですね、、、
それでは。
参考文献