かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

JavaScript 再帰関数でもカリー化したい

再帰内で使う値を先に生成して使いたかったので、再帰関数をカリー化 したいと思ってやってみたのでメモ。

🍛カリー化 (currying)とゎ?

1. カリー化した callback 関数を再帰関数に渡すパターン

const curry = (func, validFunc) => {
  return (arg, callback) => {
    if ( !validFunc(arg) ) {
      return arg;
    }
    const res = func(arg);
    callback(res, callback);
  }
};

const recursiveFunc = curry(fun, validFuc);
const res = recursiveFunc(val, recursiveFunc);

2. 再帰呼び出しで再度カリー化させた関数を呼び出す

const curry = (func, validFunc) => {
  return (arg) => {
    if (!validFunc(arg)) {
      return arg;
    }
    const res = func(arg);
    curry(func, validFunc)(res); // 自身でカリー化するして呼び出す
  }
};

const recursiveFunc = curry(fun, validFunc);
const res = recursiveFunc(val); // カリー化された関数を渡す必要が無くなる

sample

See the Pen Recursive function with Currying Test by KIKIKI (@kikiki_kiki) on CodePen.

所感

再帰関数内でカリー化して呼び出す 2 の方が呼び出し側は楽だけど、都度関数オブジェクトを作るから、パフォーマンス面では 1. のコールバック関数を作ってしまって渡すの方が良さそうな気がする。詳しくは解ってないケド

note.
  • 再帰関数: Recursive function
  • カリー化: currying

[参考]

スパイスマジックでつくる カレーの法則

スパイスマジックでつくる カレーの法則

  • 作者:水野 仁輔
  • 発売日: 2006/07/13
  • メディア: 単行本(ソフトカバー)

最近スパイスだけでカレー作るのにはまってます