RAMDA怠惰
RAMDAのtransduce
ためにはcreation of lazy sequencesができます。RAMDAのトランスデューサ:レイジー1対多のブランチ
多く
R.chain
の一つはそれほど(REPL)のように、1対多数の演算子として、変換器に使用することができる。
const tapLog = R.tap((what) => console.log(what))
const suits = ['♠', '♥', '♦', '♣']
const ranks = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'J', 'Q', 'K', 'A']
const addRank = (suit) => R.map(concat(suit),ranks)
var transducer = R.compose(
R.chain(addRank),
tapLog,
R.take(2)
);
R.into([], transducer, suits);
// => ♠1 // console.log
// => ♠2 // console.log
// => ["♠1", "♠2"]
問題
問題と上のスニペットはR.map(concat(suit),ranks)
が怠惰ではないということです - すべてのランクがマッピングされ(中間配列を作成する)、チェーンだけがトランスデューサシーケンスを1つずつパイプします。
680kグラフノードをマッピングしない限り、これは問題ではありません。
なぜこのようなことが起こりますか?
R.chain
の実装はそうのようになります。
var chain = _curry2(_dispatchable(['fantasy-land/chain', 'chain'], _xchain, function chain(fn, monad) {
if (typeof monad === 'function') {
return function(x) { return fn(monad(x))(x); };
}
return _makeFlat(false)(map(fn, monad));
}));
そして、それはそのブロック_makeFlat
任意の遅延評価です。
目標
は怠惰な1対多のトランスデューサ・ブランチを作成する方法はありますか?
R.reduceはiterablesをサポートしています。
また、ソリューションが提供されていますが、ramdaを使用していないrelated github issueを参照してください。これは私の後ろです。
だから、血まみれのシンプル!あなたは私の質問に答えただけでなく、「R.transduce」の文書全体を完全に解読しています。どのようなことが推測されているのでしょうか?[答えはそこにすべてありました](https://github.com/ramda/ramda/blob/f494250c0aed9ecc096cc5b5b7823661edc14de2/source/internal/_xtap.js)、それは私を騙したすべてのノイズです!私はあなたの答えを少し修正してinit/resultを詳しく説明しました。 – Izhaki