Javascript 拉姆达:对管道感到困惑吗
我正在学习JS中的函数式编程,我正在使用Ramda 我试图创建一个函数,它接受参数并返回一个列表。代码如下: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
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