Wikipedia article on the Y combinator提供了 Y 组合器的以下 JavaScript 实现:
function Y(f) {
return (
(function (x) {
return f(function (v) { return x(x)(v); }); })
(function (x) {
return f(function (v) { return x(x)(v); }); })
);
}
JavaScript 中 Y 组合器的存在意味着每个 JavaScript 函数都有一个不动点(因为对于每个函数 g
、Y(g)
和 g(Y(g))
应该相等)。
但是,不难想出违反 Y(g) = g(Y(g))
的不带不动点的函数(参见 here )。甚至某些泛函也没有不动点(参见 here )。
每个函数都有不动点的证明如何与给定的反例协调一致? JavaScript 不是一种无类型的 lambda 演算,其中 Y(g) = g(Y(g))
的证明适用吗?
最佳答案
据我对维基百科文章的理解,它并不暗示“每个 JavaScript 函数都有一个固定点”,这个例子只是展示了如何为按照其规范具有它的函数实现 Y 组合子。
不,根据那篇文章和 an article on fixed point 中的定义,JavaScript 不能是无类型的 lambda 演算,因为它可以制定显然无法通过“有不动点”检查的函数,例如 function f(x){ return x + 1 }
或 x ^ 1
如果你想包含非数字并因此失败“每个函数都有至少一个固定点”检查。
关于javascript - Y 组合器 : Some functions do not have fixed points,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11032481/