我正在学习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))?

最佳答案

阅读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>

10-06 00:56