カリー化(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のイベントハンドラ

関数の扱いに慣れてくると、コードの再利用性や抽象度が一気に上がります。

ぜひ「関数を分解する」感覚を身につけて、レベルアップしていきましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。