Ich habe versucht, den Y-Kombinator in Javascript zu implementieren.Warum kann ich in Javascript nicht x => f (f) (x) durch f (f) ersetzen?
ich es geschafft, die folgende Maßnahmen durchzuführen:
const y0 = gen => (f => f(f))(f => gen(x => f(f)(x)));
const factorial0 = y0(fact => n => n<=2 ? n : n * fact(n-1));
console.log(factorial0(5));
// 120
Es funktioniert gut.
Dann erwog ich den Ausdruck x => f(f)(x)
.
Mein Verständnis ist, dass ein Ausdruck x => g(x)
entspricht g
entspricht. Die Anwendung von y
auf x => g(x)
ergibt g(y)
, während die Anwendung y
auf g
auch g(y)
ergibt.
So ersetzt ich x => f(f)(x)
von f(f)
.
const y = gen => (f => f(f))(f => gen(f(f)));
const factorial = y(fact => n => n<=2 ? n : n * fact(n-1));
console.log(factorial(5));
// RangeError: Maximum call stack size exceeded
Aber diese Version stürzt mit einem Stapelüberlauf ab.
Also was ist der Unterschied zwischen x => f(f)(x)
und f(f)
so dass der eine funktioniert und der andere abstürzt.
Weil strenge Bewertung. – Bergi
@Bergi Drei Wörter - ich nenne das eine faule Erklärung: D – ftor