javascript - 研究什么来解决这类问题?
问题描述
我通过反复试验解决了以下问题,但仍然没有正确理解我是如何做到的。
有一个功能缺点:
const cons = (x, y) => f => f(x, y);
将值存储到变量对:
const pair = cons(5, 3);
创建两个函数 car 和 cdr ,它们每个都会返回一个参数。
car(pair); // 5
cdr(pair); // 3
我查看了函数组合和柯里化,但没有发现任何与此相似的。我应该学习什么才能更好地理解这个主题?
编辑:(解决方案)
const car = pair => pair((x, y) => x);
const cdr = pair =>pair((x,y) => y);
解决方案
您可以再使用两个返回特殊参数的函数,例如left
andright
和两个想要的函数,用于car
返回cdr
闭包的调用。
一个标准的方法是看,你有什么
cons = (x, y) => f => f(x, y)
以及你想得到什么
car(pair) // --> x
cdr(pair) // --> y
然后你需要两个函数来获取or 或 y,它接管了andx
的闭包。cons
x
y
最后的决定是使用该函数car
并cdr
采用一个闭包,该闭包返回一个函数,该函数接受一个函数f
进行调用。
结果是 或 的x
值y
。
const
cons = (x, y) => f => f(x, y),
left = (l, r) => l,
right = (l, r) => r,
car = fn => fn(left),
cdr = fn => fn(right),
pair = cons(5, 3);
console.log(car(pair)); // 5
console.log(cdr(pair)); // 3
推荐阅读
- javascript - Angular如何获取动态创建的div的高度并将其发送到兄弟组件?
- git - 如何使用 git 完成与 mercurial 相同的工作流程?
- qml - 我应该通过什么条件才能再次显示弹出窗口
- python - 我可以使用python打开android设备的热点吗
- react-native - 在反应本机类型的影子节点中更新属性“开始”时
- laravel - 如何解决 npm run dev
- wordpress - 在页面中进行某些更改时防止恢复为默认模板
- neo4j - 如何在 Neo4j 中获取从根到叶的所有路径(DFS 方式)并返回包含节点和关系的结果
- python - 如何在python中安排异步函数的执行并立即返回
- c - 在标准输入中使用 c 中的 read() 函数时区分剪贴板事件