理解 Ramda 中的组合?

Understanding compose in Ramda?

我对我在 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>

compose函数接受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 被传递给过滤器,它需要两个参数,returns 部分应用函数(顺便说一句 - 因为谓词是 false 会失败)。


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

(["test"],3)传递给R.pathEq,结果是R.pathEq(["test"],3)传递给filter,得到与案例1相同的功能,应用于objs.


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

["test"]传递给R.pathEq,其中returns一个函数,后者传递给R.filter(),其中returns一个函数。但是,该函数现在获得数字 3。过滤 3 returns 一个空数组,它在 objs 上调用,由于数组不是函数,您会收到错误消息。