我试图在Javascript中实现Y组合器。在Javascript中,为什么我不能用f(f)代替x => f(f)(x)?
我设法执行下列规定:
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
它运作良好。
然后我正在考虑表达式x => f(f)(x)
。
我的理解是,表达式x => g(x)
等于g
。将y
应用于x => g(x)
评估为g(y)
,同时将y
应用于g
也评估为g(y)
。
所以我用f(f)
替换了x => f(f)(x)
。
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
但是这个版本崩溃了堆栈溢出。
那么x => f(f)(x)
和f(f)
之间的区别是什么,这样一个工程和其他崩溃。
因为严格评估。 – Bergi
@Bergi三个字 - 我把它称为一个懒惰的解释:D – ftor