Gegeben ist die folgende rekursive map
Funktion:Kann eine rekursive Funktion in Curry-Form tail rekursiv sein?
const U = f => f(f);
const map = f => U(h => acc => ([head, ...tail]) => head === undefined
? acc
: h(h)([...acc, f(head)])(tail))([]);
const xs = [1,2,3,4,5];
console.log(map(x => x * x)([1,2,3,4,5]));
Offensichtlich h(h)
der rekursive Aufruf nicht die letzte Aktion der rekursiven Funktion ist. Aber wenn der Stapel abgewickelt wird, geschieht alles, was passiert, dass der fertige Akkumulator ohne weitere Änderungen oder Operationen zurückgegeben wird. Ist map
entgegen meiner Erwartungen tail rekursiv?
Ich denke, diese Implementierung eine verwirrte 'map' ist. Es mischt "map" und "reduce" in einem Vorgang. Ich teile [gist: u.js, y.js] (https://gist.github.com/anonymous/6ccdd17b0b16f75bc38af2930ca6655f) um zu zeigen, dass zwei separate Prozeduren die Lesbarkeit von 'map' unterstützen. Ich habe auch eine Implementierung mit "Y" durchgeführt, um zu zeigen, wie die beiden Implementierungen miteinander verglichen werden. Sie wissen das wahrscheinlich, aber der einzige Unterschied zu "Y" ist, dass Sie nur "h" anstelle von "h (h)" anwenden. Oh und ja, Schwanz ruft überall hin. Jetzt warten wir nur auf eine Engine, die Tail Call Eliminierung implementiert ... – naomik
Dank @naomik, stimme ich absolut mit Ihnen überein. Dies war nur eine Herausforderung, wie 'map' implementiert werden kann, ohne es von' reduce' abzuleiten. Ich hatte nicht die Absicht, dies zu veröffentlichen, bis mich die Curry-Anwendung in Schwanzposition verblüffte. – ftor
Kein Problem **^_^** – naomik