关于带有多个参数的函数。
特别是我假设“管道”和“撰写”。它们将多个函数作为参数。
这时,我想传递一个包含多个函数的列表。
在Ramda.js中通常:
const piped = R.pipe(R.inc, R.negate);
我想要这样:
const funcs = [R.inc, R.negate];
const piped = R.pipe(funcs);
我也在考虑传递部分应用函数的列表
const funcs = [R.add (1), R.pow (2)];
这些列表中的函数没有name属性。所以我想知道是否可以通过将这些Ramdajs函数和部分应用函数绑定到变量来找到解决方案。但他们似乎并不那么聪明。
这是我第一次使用英语和堆栈溢出。对于丑陋的英语我很抱歉,因为它是一种机械翻译。我该如何解决这个问题,请告诉我解决方案。谢谢。
Ramda.js函数是正常的javascript函数,因此可以使用Function.call
和Function.apply
方法。
因此,您的问题的解决方案是使用.apply
方法应用多个参数(即列表):
例:
const funcs = [R.inc, R.negate];
const piped = R.pipe.apply(R, funcs);
还有一个Ramda.apply
(你可以在Ramda文档中查看)但是原生的Function.apply
方法优雅地和原生地解决了这个问题(注意根据pipe
function的文档,没有提到使用特定的上下文,因为有其他一些Ramda
文档中的函数)。
回答评论:
R.apply
与本地apply
方法具有完全相同的绑定上下文问题(根据Ramda documentation)。因此,apply
方法的背景问题大多无关紧要且不太重要。
你真正想要的是用反向函数组合combinbator(又名逆变函子)折叠函数列表:
const inc = x => x + 1;
const sqr = x => x * x;
const reduce1 = f => xs =>
xs.reduce(f);
const contra = (g, f) => x =>
f(g(x));
console.log(
reduce1(contra) ([inc, inc, inc, sqr]) (1)); // 16
这仅适用于非空数组。我们需要一个带累加器的折叠来使部分应用的折叠reduce1(contra)
成为一个总函数:
const inc = x => x + 1;
const sqr = x => x * x;
const id = x => x;
const reduce = f => acc => xs =>
xs.reduce(f, acc);
const contra = (g, f) => x =>
f(g(x));
const pipen = reduce(contra) (id);
console.log(
pipen([inc, inc, inc, sqr]) (1)); // 16
console.log(
pipen([]) (1)); // 1
在拉姆达,使用R.apply
完全没问题。但请注意,此功能特定于Ramda。