私はJのコンビネータをJavascriptで実装しようとしていました。Javascriptではなぜx => f(f)(x)をf(f)に置き換えることができないのですか?
私は次のことを実現するために管理:
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)
と評価されます。
x => f(f)(x)
を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
しかし、このバージョンはスタックオーバーフローでクラッシュします。
したがって、x => f(f)(x)
とf(f)
の違いは、1つが動作し、もう1つがクラッシュするためです。
x => f(f)(x)
厳しい評価のため、 – Bergi
@Bergi 3つの言葉 - 私はこれを怠惰な説明と呼びます:D – ftor