我試圖在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