将函数列表传递给管道或在Ramda.js中撰写

问题描述 投票:0回答:2

关于带有多个参数的函数。

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

这时,我想传递一个包含多个函数的列表。

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

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

javascript functional-programming ramda.js
2个回答
-1
投票

Ramda.js函数是正常的javascript函数,因此可以使用Function.callFunction.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方法的背景问题大多无关紧要且不太重要。


1
投票

你真正想要的是用反向函数组合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。

© www.soinside.com 2019 - 2024. All rights reserved.