Javascript 拉姆达:对管道感到困惑吗

Javascript 拉姆达:对管道感到困惑吗,javascript,functional-programming,ramda.js,function-composition,Javascript,Functional Programming,Ramda.js,Function Composition,我正在学习JS中的函数式编程,我正在使用Ramda 我试图创建一个函数,它接受参数并返回一个列表。代码如下: const list = R.unapply(R.identity); list(1, 2, 3); // => [1, 2, 3] 现在我尝试使用管道: const otherList = R.pipe(R.identity, R.unapply); otherList(1,2,3); // => function(){return t(Array.prototype

我正在学习JS中的函数式编程,我正在使用Ramda

我试图创建一个函数,它接受参数并返回一个列表。代码如下:

const list = R.unapply(R.identity);

list(1, 2, 3); // => [1, 2, 3]
现在我尝试使用
管道

const otherList = R.pipe(R.identity, R.unapply);

otherList(1,2,3);
// => function(){return t(Array.prototype.slice.call(arguments,0))}
返回一个奇怪的函数

这:

因为某种原因而起作用


我知道这可能是一个新手问题,但是如果f是
unapply
且g是
identity
,你将如何用
pipe
构造f(g(x))?

阅读
R.unapply
。它是一个函数,获取一个函数并返回一个函数,该函数可以接受多个参数,将其收集到单个数组中,并将其作为包装函数的参数传递

因此,在第一种情况下,它将
R.identity
转换为一个可以接收多个参数并返回数组的函数

在第二种情况下,
R.unapply
获取
R.identity
的结果-一个值,而不是一个函数。如果将
R.identity
作为参数传递给管道,
R.unapply
将获取一个函数并返回一个函数,这与第一种情况类似

要使
R.unapply
使用
R.pipe
,您需要将
R.pipe
传递到
R.unapply

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8
const fn=R.unapply(R.pipe(
R.身份
))
常数结果=fn(1,2,3)
console.log(结果)

读取
R.unapply
。它是一个函数,获取一个函数并返回一个函数,该函数可以接受多个参数,将其收集到单个数组中,并将其作为包装函数的参数传递

因此,在第一种情况下,它将
R.identity
转换为一个可以接收多个参数并返回数组的函数

在第二种情况下,
R.unapply
获取
R.identity
的结果-一个值,而不是一个函数。如果将
R.identity
作为参数传递给管道,
R.unapply
将获取一个函数并返回一个函数,这与第一种情况类似

要使
R.unapply
使用
R.pipe
,您需要将
R.pipe
传递到
R.unapply

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8
const fn=R.unapply(R.pipe(
R.身份
))
常数结果=fn(1,2,3)
console.log(结果)

您可以使用
将通常将其参数作为数组的函数转换为可以接受任意数量位置参数的函数:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6
unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]
除其他外,这允许您映射任意数量的位置参数:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6
unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]
identity
将始终返回其第一个参数。因此
unapply(identity)(1,2)
identity([1,2])
相同

如果您的最终目标是创建一个返回其参数列表的函数,那么我认为您首先不需要
pipe
unapply(identity)
已经在这样做了

但是,如果您需要做的是确保管道以列表的形式获取其参数,那么您只需使用
不应用
包装
管道

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8

您可以使用
unapply
将通常以数组形式接受其参数的函数转换为可以接受任意数量位置参数的函数:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6
unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]
除其他外,这允许您映射任意数量的位置参数:

sum([1, 2, 3]); //=> 6
unapply(sum)(1, 2, 3) //=> 6
unapply(map(inc))(1, 2) //=> [2, 3]
unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]
identity
将始终返回其第一个参数。因此
unapply(identity)(1,2)
identity([1,2])
相同

如果您的最终目标是创建一个返回其参数列表的函数,那么我认为您首先不需要
pipe
unapply(identity)
已经在这样做了

但是,如果您需要做的是确保管道以列表的形式获取其参数,那么您只需使用
不应用
包装
管道

const sumplusplus = unapply(pipe(sum, inc, inc));
sumplusplus(1, 2, 3); //=> 8

看起来好像你真的在错误地思考
pipe

使用
unapply(identity)
时,将函数
identity
传递给
unapply

但是当您尝试
pipe(identity,unapply)
时,返回一个函数,该函数将调用
identity
的结果传递给
unapply


这种方法的有效性很大程度上是巧合:
pipe(identity,unapply)(identity)
。将其视为
(…args)=>unapply(identity(identity))(…args)
。由于
identity(identity)
只是
identity
,这就变成了
(…args)=>unapply(identity)(…args)
,可以简化为
unapply(identity)
。这只意味着一些重要的事情,因为
标识的性质

看起来您确实在错误地思考
管道

使用
unapply(identity)
时,将函数
identity
传递给
unapply

但是当您尝试
pipe(identity,unapply)
时,返回一个函数,该函数将调用
identity
的结果传递给
unapply


这种方法的有效性很大程度上是巧合:
pipe(identity,unapply)(identity)
。将其视为
(…args)=>unapply(identity(identity))(…args)
。由于
identity(identity)
只是
identity
,这就变成了
(…args)=>unapply(identity)(…args)
,可以简化为
unapply(identity)
。这只意味着一些重要的事情,因为
标识的性质

注意拼写是'Ramda',而不是'Rambda'。我为你编辑过。请注意拼写是“Ramda”,而不是“Rambda”。我已经为你编辑过了。
unapply(pipe(identity))
unapply(identity)
不一样吗?@customcommander是的,因为前者是
unapply(x=>identity(x))
,可以简化为
unapply(identity))
不是
unapp