理解 Ramda 中的组合?
Understanding compose in Ramda?
我对我在 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>
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
,结果是false
。 false
被传递给过滤器,它需要两个参数,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
上调用,由于数组不是函数,您会收到错误消息。
我对我在 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>
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
,结果是false
。 false
被传递给过滤器,它需要两个参数,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
上调用,由于数组不是函数,您会收到错误消息。