繁体   English   中英

将函数列表传递给 Ramda.js 中的管道或组合

[英]Pass a list of functions to pipe or compose in Ramda.js

关于采用多个参数的函数。

特别是我假设“管道”和“撰写”。 它们将多个函数作为参数。

这时候,我想给他们传递一个多个函数的列表。

在 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 函数和部分应用函数绑定到变量来找到解决方案。 但他们似乎并不那么聪明。

这是我在英语和堆栈溢出方面的第一次体验。 我很抱歉用丑陋的英语,因为它是机械翻译。 我该如何解决这个问题,请告诉我解决方案。 谢谢你。

将数组转换为多个参数的最简单方法是解构。 在参数前添加“...”:

const funcs = [R.inc, R.negate];
const piped = R.pipe(...funcs);

更多关于解构的信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

您真正想要的是使用反向函数组合组合器(又名逆变函子)折叠函数列表:

 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 ,使用R.apply完全没问题。 但请注意,此功能是特定于 Ramda 的。

Ramda.js函数是普通的 javascript 函数,因此Function.callFunction.apply方法可用。

因此,您的问题的解决方案是使用.apply方法来应用多个参数(即列表):

例子:

const funcs = [R.inc, R.negate];
const piped = R.pipe.apply(R, funcs);

还有一个Ramda.apply (你可以在Ramda.apply文档中查看)但是原生Function.apply方法优雅地解决了这个问题(注意,根据pipe函数的文档,没有提到使用特定的上下文作为Ramda文档中有一些其他功能)。

回复评论:

R.apply与本地apply方法具有完全相同的绑定上下文问题(根据Ramda 文档)。 因此, apply方法的上下文问题大多无关紧要,重要性不高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM