LoginSignup
1
2

More than 1 year has passed since last update.

カリー化で一部の引数を固定して関数を複製する

Last updated at Posted at 2022-05-24

カリー化とは

カリー化とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。

文字だけでは全然わからないと思うのでコードで解説します。

下記のように引数を2つ受け取る関数があるとします。

sample(arg1, arg2) {
  console.log(`引数1:${arg1}, 引数2:${arg2}`)
};

sample('りんご', 'ぶどう');
// => 引数1:りんご, 引数2:ぶどう

これはみんなおなじみの普通の関数。

sampleという名前で関数を定義し、arg1arg2という二つの引数をとっています。

このときに、引数1だけを固定して、引数2だけを変えて何回かこの関数を呼び出したい場合、上記のままだとこうなります。

sample('りんご', 'ぶどう');

sample('りんご', 'スイカ');

sample('りんご', 'ドラゴンフルーツ');

なんか冗長ですよね、、、

1つ目の引数のりんごを何回も呼び出すのがなんか気持ち悪い、、

具体例が下手くそすぎて申し訳ないのですが、
このように一部の引数を固定して、残りの引数を動的に変更させたい場合、カリー化が役に立ちます。

// 普通の関数
sample(arg1, arg2) {
  return `引数1:${arg1}, 引数2:${arg2}`
};

// カリー化
curryingSample(arg1) {
  return (arg2) => {
    console.log(`引数1:${arg1}, 引数2:${arg2}`);
  }
};

const fixedAppleFunc = curryingSample('りんご');

fixedAppleFunc('ぶどう');
// => 引数1:りんご, 引数2:ぶどう

fixedAppleFunc('スイカ');
// => 引数1:りんご, 引数2:スイカ

fixedAppleFunc('ドラゴンフルーツ');
// => 引数1:りんご, 引数2:ドラゴンフルーツ

ここでもう一度最初の説明文を載せます。

カリー化とは、複数の引数をとる関数(sample())を、引数が「もとの関数の最初の引数(arg1)」で戻り値が「もとの関数の残りの引数(arg2)を取り結果を返す関数(curryingSample()内でreturnされているアロー関数)」であるような関数(curryingSample())にすること(あるいはその関数のこと)である。

本当に具体例が下手すぎて恐縮なんですが、最初よりは理解が深まったと思います笑

おまけ

自分が実際に実務でこのカリー化を使った時は、map()で指定するコールバック関数にこのカリー化した関数を使いました。

curryingFunc(arg1, arg2) {
  return (arg3) => {
    // 処理
  }
};

const fixedArgumentsFunc = curryingFunc('固定したい引数1', '固定したい引数2')

const results = array.map(fixedArgumentsFunc);

こんな感じで、map()で回す値だけを動的に変えたいときに使いました

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2