Ich versuche, eine List
Monade in ES6 mit Generatoren zu erstellen. Damit es funktioniert, muss ich eine Kopie eines Iterators erstellen, der bereits mehrere Zustände verbraucht hat. Wie klone ich einen Iterator in ES6?Wie man ES6 Generator klont?
function* test() {
yield 1;
yield 2;
yield 3;
}
var x = test();
console.log(x.next().value); // 1
var y = clone(x);
console.log(x.next().value); // 2
console.log(y.next().value); // 2 (sic)
habe ich clone
und cloneDeep
von lodash
versucht, aber sie waren nicht von Nutzen. Iteratoren, die auf diese Weise zurückgegeben werden, sind native Funktionen und behalten ihren Status intern bei. Es scheint also, dass es keinen Weg gibt, dies mit eigenem JS-Code zu tun.
Memoizing die vorherigen Werte würden helfen, wenn ich vorherige Ergebnisse noch einmal bekommen will, aber das ist nicht der Punkt, der Frage. Ich hatte die Option, Argumente für "next" zu memotisieren, so dass ich einen weiteren Iterator vom selben Generator erstellen und ihn bis zum selben Punkt wiederholen konnte. Das Problem bei diesem Ansatz war, dass Funktionen in ES nicht rein sind, und es ist möglich, dass ich beim zweiten Durchlauf desselben Generators andere Ergebnisse erhalten würde. Ich denke, dass ich besser in einen Maillisten von "Harmonie" einsteigen und die Frage dort stellen sollte, wenn niemand mit einer besseren Idee des Klonens eines Iterators kommt. –
Vielleicht verstehe ich Ihren Anwendungsfall nicht gut genug. Ist dein Generator eigentlich rein? Übergeben Sie jemals Argumente an '.next()'? Wie werden die beiden Iteratoren (ursprünglich und geklont) tatsächlich verbraucht? – Bergi
Ich versuche, den folgenden Code auszuführen, der Haskell's nondeterminism Monade ähnelt (http://ideone.com/kGF9KY). Für jedes Element "x" des Arrays "iter.next (prev) .value" muss es als Argument an das nächste "request" übergeben werden. Auf diese Weise wird der Code nach "yield" mehrmals mit verschiedenen "Rückgabewerten" ausgeführt, daher kein Determinismus. –