我对我在 REPL 中使用的以下 Ramda 代码有点困惑。我对函数式编程还很陌生,我试图理解为什么 result2
和 result4
不起作用。这是我的逻辑: 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
传递给它,结果是false
。 false
被传递给过滤器,它需要两个参数,并返回部分应用的函数(顺便说一句 - 因为谓词是 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/