再帰内で使う値を先に生成して使いたかったので、再帰関数をカリー化 したいと思ってやってみたのでメモ。
🍛カリー化 (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
- メディア: 単行本(ソフトカバー)
最近スパイスだけでカレー作るのにはまってます