【发布时间】:2018-02-09 22:08:01
【问题描述】:
我遇到了另一个关于 Javascript 中递归的 SO 问题的答案,它在 ES6 中使用 Y 组合器,使用 ES6 的胖箭头给出了一个非常简洁的形式,并认为 嘿,使用起来会很整洁 - 大约 15 分钟后又回到了 hm,也许不是。
我之前参加过一些 Haskell/Idris 讲座并运行过一些代码,并且熟悉标准 JS,所以希望我能够弄清楚这一点,但不太明白一个简单的“做nrecursion and return" 应该去哪里,在哪里实现一个递减计数器。
我只是想简化获取 DOM 元素的 nth 父节点的过程,而且似乎有比此类简单应用程序示例更密集的解释所有指南。
我第一次看到的example是:
const Y = a => (a => a(a))(b => a(a => b(b)(a)));
虽然this 最近的回答给出了:
const U = f => f (f)
const Y = U (h => f => f (x => h(h)(f)(x)))
...给出了内部函数可能是什么的示例,以及一些示例输出,但引入 U-combinator 并不能真正帮助我澄清这一点。
在第一个示例中,我无法真正开始理解 b 在我的情况下可能是什么 - 我知道我需要一个函数 a 来返回父节点:
const par = function(node) {
return node.parentNode;
}
我想出了以下内容:
function RecParentNode(base_node, n) {
// ES6 Y-combinator, via: https://stackoverflow.com/a/32851197/2668831
// define immutable [const] functions `Y` and `fn` [`fn` uses `Y`]
// the arguments of `Y` are another two functions, `a` and `b`
const Y = par=>(par=>par(par))(b=>par(par=>b(b)(par)));
const fn = Y(fn => n => {
console.log(n);
if (n > 0) {
fn(n - 1);
}
});
}
但后来看不到如何处理闲置的备用b,正准备将其全部删除而忘记了我的烦恼。
我只想应用 par 函数 n 次,因为我知道的唯一选择是链接 .parentNode.parentNode.parentNode... 或作弊并将字符串转换为 eval 调用.
希望熟悉函数式 JS 的人可以帮助我了解如何使用 Y-combinator 来制作这个辅助函数 RecParentNode - 谢谢!
【问题讨论】:
标签: javascript recursion y-combinator