gpt4 book ai didi

javascript - 在 Javascript 中,为什么我不能用 f(f) 替换 x => f(f)(x) ?

转载 作者:行者123 更新时间:2023-11-28 13:10:57 25 4
gpt4 key购买 nike

我试图在 Javascript 中实现 Y 组合器。

我设法实现了以下内容:

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) 之间有什么区别,一个可以工作,另一个则崩溃。

最佳答案

x => f(f)(x)

是一个带有一个参数x的函数。当调用该函数时,它会依次调用函数 f,并将对 f 的引用作为参数传递。函数 f 返回另一个函数,然后调用该函数,并将 x 作为参数传递。

在老式语法中,它是

function(x) {
return f(f)(x);
}

这与 f(f) 本身有很大不同。这只是函数“f”的调用,“f”作为参数传递。

因此,x => f(f)(x)f(f) 都是表达式,但它们代表的语义明显不同。第一个的值是对函数的引用;表达式本身不执行任何其他操作 - 特别是,不调用函数f()f(f) 的值是函数 f() 在被调用时返回的值 - 该表达式确实做了某事,即任何函数 >f() 确实如此。

关于javascript - 在 Javascript 中,为什么我不能用 f(f) 替换 x => f(f)(x) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42458017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com