拉姆达:对烟斗感到困惑

时间:2019-01-10 19:07:13

标签: javascript functional-programming ramda.js function-composition

我正在学习JS中的函数式编程,并且正在使用Ramda进行。

我正在尝试制作一个带有参数并返回列表的函数。这是代码:

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))}

哪个返回一个奇怪的函数。

此:

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

otherList(R.identity)(1,2,3); // => [1, 2, 3]

由于某些原因起作用。

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

3 个答案:

答案 0 :(得分:2)

阅读R.unapply docs。这个函数可以获取一个函数并返回一个函数,该函数可以采用多个参数,将其收集到单个数组中,然后将其作为包装函数的参数传递。

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

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

要使R.unapplyR.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>

答案 1 :(得分:2)

似乎您确实在错误地想到pipe

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

但是,当您尝试使用pipe(identity, unapply)时,您会得到一个返回将调用identity到<{1}}的结果的函数。

此方法主要是偶然的:unapply。将其视为pipe(identity, unapply)(identity)。由于(...args) => unapply(identity(identity))(...args)只是identity(identity),因此变成identity,可以简化为(...args) => unapply(identity)(...args)。由于unapply(identity)的性质,这仅意味着重要的事情。

答案 2 :(得分:1)

您将使用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将始终返回其第一个参数。因此,unapply(identity)(1,2)identity([1,2])相同。

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

但是,如果您需要做的是确保管道将其参数作为列表获取,则只需用pipe包装unapply

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