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