javascript - 了解 Ramda 中的 compose?

标签 javascript ramda.js

我对我在 REPL 中使用的以下 Ramda 代码有点困惑。我对函数式编程还很陌生,我试图理解为什么 result2result4 不起作用。这是我的逻辑: h = compose(f,g) 的行为应该与 h=f(g(x)) 相同,但看起来我不是理解正确。

const objs = [{test: 3, name: "name1"}, {test: 4, name: "name2"}]
const myPath = R.pathEq(["test"])
// works fine
const result1 = R.compose(R.filter,myPath)(3)(objs)
// doesn't work!
const result2 = R.compose(R.filter,myPath(3))(objs)

console.log(result1);
console.log(result2);

// works fine as in result1
const result3 = R.compose(R.filter,R.pathEq)(["test"],3)(objs);
// throws exception!
const result4 = R.compose(R.filter,R.pathEq)(["test"])(3)(objs);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

最佳答案

撰写函数接受 n参数,并将其传递给第一个函数,第一个函数(可以是函数)的结果传递给第二个函数(它应该只接受一个参数)。使用该参数调用第二个函数,结果也可以是一个函数。

在您的代码中, compose 的结果(在应用 objs 之前)应等于 filter(R.pathEq(["test"], 3)) 。然后该函数将应用于 objs .


案例 1 - R.compose(R.filter,myPath)(3)

myPath包含接收 3,我们得到 R.pathEq(["test"], 3)被传递到 R.filter成为filter(R.pathEq(["test"], 3))功能。


案例2 - R.compose(R.filter,myPath(3))(objs)

调用myPath(3)就像设置 R.pathEq(["test"], 3)直接地。现在objs传递给它,结果是falsefalse被传递给过滤器,它需要两个参数,并返回部分应用的函数(顺便说一句 - 因为谓词是 false 会失败)。


案例3 - R.compose(R.filter,R.pathEq)(["test"],3)(objs)

(["test"],3)被传递到R.pathEq ,结果为 R.pathEq(["test"],3)它被传递给过滤器,您将获得与情况 1 相同的函数,该函数应用于 objs .


案例 4 - R.compose(R.filter,R.pathEq)(["test"])(3)(objs);

["test"]被传递到R.pathEq ,它返回一个函数,该函数被传递给 R.filter() ,它返回一个函数。但是,该函数现在获取数字 3 。筛选3返回一个空数组,该数组在 objs 上调用,并且由于数组不是函数,因此您会收到错误消息。

关于javascript - 了解 Ramda 中的 compose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453160/

相关文章:

javascript - 深色主题切换按钮的可缩放大小

javascript - 响应调整大小

javascript - 我应该如何使用 PHP Excel 将 MYSQL 数据导出到 Excel

javascript - 如何使用 Ramda 深度映射对象

javascript - Ramda,计数数组中的值频率

javascript - 使用 Ramda 将对象数组转换为普通对象

javascript - 找不到元素的子元素

javascript - 在 JS For 循环中创建 Bootstrap slider

javascript - 如何以函数式JS方式使用Ramda实现LoDash的sampleSize?

javascript - 删除数组中所有重复项和未定义项。 Ramda.js