カリー化(Currying)の考え方とは?―JavaScript初心者のためのやさしい入門講座
こんにちは。ゆうせいです。
関数型プログラミングを学んでいると、ある日こんな言葉に出会います。
「カリー化(Currying)」
「えっ、カレー??」「難しそうな数式の話?」と戸惑う方も多いのではないでしょうか。
でも安心してください。JavaScriptでも自然に使える「関数を小分けにするテクニック」のことなんです!
今回は、カリー化の考え方とその意味・使いどころ・実践例をわかりやすく解説します。
カリー化(Currying)とは?
複数の引数をとる関数を、1つずつ引数を渡していける関数に変換すること
たとえば、次のような関数があったとします。
function add(a, b) {
return a + b;
}
この関数をカリー化すると、次のような形になります:
function curriedAdd(a) {
return function (b) {
return a + b;
};
}
curriedAdd(2)(3); // → 5
つまり、1つの引数を受け取って、新しい関数を返すという構造です。
カリー化の目的は?
✅ 1. 引数の“事前設定”ができる
const add10 = curriedAdd(10);
console.log(add10(5)); // → 15
10を足す関数をあらかじめ作っておける、というイメージです。
✅ 2. 再利用性が上がる
複数の処理に共通する引数を「固定」しておけば、あとから別の引数だけを与えることができます。
図で理解する:カリー化とは?
[通常の関数]
f(a, b) → 結果
[カリー化]
f(a) → 関数g(b)
↓
g(b) → 結果
実用的な例:カリー化を使って関数を「仕込み」しておく
function greet(greeting) {
return function (name) {
console.log(`${greeting}、${name}さん!`);
};
}
const sayHello = greet("こんにちは");
sayHello("太郎"); // → こんにちは、太郎さん!
sayHello("花子"); // → こんにちは、花子さん!
このように、greetingを先に渡して「挨拶関数」を作っておくという考え方ができます。
実際にカリー化するには?
通常の関数をカリー化する関数(カリーファイ)
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn(...args);
} else {
return function (...next) {
return curried(...args, ...next);
};
}
};
}
// 使用例
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // → 24
console.log(curriedMultiply(2, 3)(4)); // → 24
console.log(curriedMultiply(2)(3, 4)); // → 24
このように「1つずつでも、まとめてでも引数を渡せる」のがカリー化の強力な点です。
カリー化と部分適用の違いは?
よく似ている概念に「部分適用(Partial Application)」というものがあります。
項目 | カリー化(Currying) | 部分適用(Partial Application) |
---|---|---|
定義方法 | 1引数ずつ関数を返す | 複数引数を一部だけ固定する |
使用目的 | 引数を段階的に渡す | 一部の引数を先に埋める |
柔軟性 | 高い | やや限定的 |
なぜJavaScriptでカリー化が使えるのか?
JavaScriptは**ファーストクラス関数(関数を値として扱える)**を持つ言語だからです。
関数を返したり、引数にしたり、組み立てたりできるからこそ、**関数の「分割」や「事前設定」**が自然にできます。
まとめ:カリー化は「関数の使い回し」を強化するテクニック!
ポイント | 内容 |
---|---|
定義 | 引数を1つずつ受け取る関数に変換する |
メリット | 引数の事前設定・再利用性・読みやすさの向上 |
よく使う場面 | 高階関数との組み合わせ・ユーティリティ関数の作成 |
JavaScriptとの相性 | 非常に良い!(ファーストクラス関数) |
今後の学習のヒント
カリー化をしっかり理解したら、次は以下のテーマもおすすめです!
- 部分適用(Partial Application)との違い
- lodashなどのユーティリティライブラリでの実践
- 高階関数との組み合わせ
- カリー化とReactのイベントハンドラ
関数の扱いに慣れてくると、コードの再利用性や抽象度が一気に上がります。
ぜひ「関数を分解する」感覚を身につけて、レベルアップしていきましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
