通过管道传递多个参数和最后一个函数的结果

时间:2019-12-06 12:33:19

标签: ramda.js

我正在使用Ramda.js构建一个管道,该管道接受三个参数。第一个函数需要这三个参数,其结果将在第二个函数中使用。但是,第二个函数也需要初始参数之一。我不知道要建立类似的分支。

在伪代码样式中,我需要这样的东西:

const composedFunction = R.pipe(
  firstFunction,
  secondFunction,
);

const firstFunction = (reusedArgument, secondArgument, thirdArgument) => someAnswer;
const secondFunction = (reusedArgument, someAnswer);

console.log(composedFunction({ foo: bar }, [5, 3, 4], [100, 12, 12]));

2 个答案:

答案 0 :(得分:3)

我可以想到一些解决方案:

将管道包装在另一个函数中,以便合成中的函数仍可以引用原始参数。

此处func2接受func1的输出,但也可以访问初始的b参数。显然,func2必须经过精心设计,并且必须接受其“数据”作为最后一个参数(这是我通常会说的Ramda和函数式编程的宗旨)。

const func3 = (a, b, c) =>
  pipe(func1, func2(b))
   (a, b, c);

func3(10, 20, 30);

其他选项func1返回一个数组,您可以在func2中对其进行分解。

我认为这不是特别好,但这是一种选择:

const func1 = (a, b, c) => [a + c, b];
const func2 = ([sum, b]) => sum * b;

const func3 = pipe(func1, func2);
func3(10, 20, 30);

答案 1 :(得分:1)

我认为这里最简单的事情是不用理会Ramda的pipe函数,该函数并非旨在处理这种情况,而只是手动编写:

const func1 = (a, b, c) => `func1 (${a}, ${b}, ${c})`
const func2 = (a, d) => `func2 (${a}, ${d})`

const func3 = (a, b, c) => func2 (func1 (a, b, c), a)

console .log (func3 ('a', 'b', 'c'))

Ramda最近成为considering a way的代名词,以使其更容易用于较长的管道;即使这样,上面的功能可能仅适用于一些功能。