Ramda:对管道感到困惑
Ramda: Confused about pipe
我正在学习 JS 函数式编程,我正在使用 Ramda 进行编程。
我正在尝试制作一个接受参数和 returns 列表的函数。这是代码:
const list = R.unapply(R.identity);
list(1, 2, 3); // => [1, 2, 3]
现在我尝试使用 pipe
:
const otherList = R.pipe(R.identity, R.unapply);
otherList(1,2,3);
// => function(){return t(Array.prototype.slice.call(arguments,0))}
哪个returns一个奇怪的函数。
这个:
const otherList = R.pipe(R.identity, R.unapply);
otherList(R.identity)(1,2,3); // => [1, 2, 3]
出于某种原因有效。
我知道这可能是一个新手问题,但是如果 f 是 unapply
并且 g 是 identity
,您将如何用 pipe
构造 f(g(x))?
阅读R.unapply
docs。它是一个获取函数和returns函数的函数,它可以接受多个参数,将其收集到一个数组中,并将其作为包装函数的参数传递。
所以在第一种情况下,它将R.identity
转换为一个可以接收多个参数的函数和return一个数组。
在第二种情况下,R.unapply
得到 R.identity
的结果 - 单个值,而不是函数。如果将 R.identity
作为参数传递给管道,R.unapply
得到一个函数,return 得到一个函数,这与第一种情况类似。
要使 R.unapply
与 R.pipe
一起工作,您需要将 R.pipe
传递给 R.unapply
:
const fn = R.unapply(R.pipe(
R.identity
))
const result = fn(1, 2, 3)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
您可以使用 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]
identity
总是 return 它的第一个参数。所以 unapply(identity)(1,2)
与 identity([1,2])
相同。
如果您的最终目标是创建一个 return 是其参数列表的函数,我认为您首先不需要 pipe
。 unapply(identity)
已经在这样做了。
但是,如果您需要做的是确保您的管道将其参数作为列表获取,那么您只需将 pipe
换成 unapply
:
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)
。由于 identity
.
的性质,这仅意味着重要的事情
我正在学习 JS 函数式编程,我正在使用 Ramda 进行编程。
我正在尝试制作一个接受参数和 returns 列表的函数。这是代码:
const list = R.unapply(R.identity);
list(1, 2, 3); // => [1, 2, 3]
现在我尝试使用 pipe
:
const otherList = R.pipe(R.identity, R.unapply);
otherList(1,2,3);
// => function(){return t(Array.prototype.slice.call(arguments,0))}
哪个returns一个奇怪的函数。
这个:
const otherList = R.pipe(R.identity, R.unapply);
otherList(R.identity)(1,2,3); // => [1, 2, 3]
出于某种原因有效。
我知道这可能是一个新手问题,但是如果 f 是 unapply
并且 g 是 identity
,您将如何用 pipe
构造 f(g(x))?
阅读R.unapply
docs。它是一个获取函数和returns函数的函数,它可以接受多个参数,将其收集到一个数组中,并将其作为包装函数的参数传递。
所以在第一种情况下,它将R.identity
转换为一个可以接收多个参数的函数和return一个数组。
在第二种情况下,R.unapply
得到 R.identity
的结果 - 单个值,而不是函数。如果将 R.identity
作为参数传递给管道,R.unapply
得到一个函数,return 得到一个函数,这与第一种情况类似。
要使 R.unapply
与 R.pipe
一起工作,您需要将 R.pipe
传递给 R.unapply
:
const fn = R.unapply(R.pipe(
R.identity
))
const result = fn(1, 2, 3)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
您可以使用 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]
identity
总是 return 它的第一个参数。所以 unapply(identity)(1,2)
与 identity([1,2])
相同。
如果您的最终目标是创建一个 return 是其参数列表的函数,我认为您首先不需要 pipe
。 unapply(identity)
已经在这样做了。
但是,如果您需要做的是确保您的管道将其参数作为列表获取,那么您只需将 pipe
换成 unapply
:
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)
。由于 identity
.