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

Passing multiple arguments and result of last function through pipe

我正在用 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]));

我能想到几个解决办法:

将你的管道包裹在另一个函数中,这样你组合中的函数仍然可以引用原始参数。

此处 func2 接受 func1 的输出,但也可以访问初始 b 参数。显然 func2 必须被柯里化并被设计为接受它的 "data" 作为最后一个参数(我会说这是 Ramda 和函数式编程的原则)。

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

func3(10, 20, 30);

其他选项,func1 returns 可以在 func2 中解构的数组。

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

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

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

我认为这里最简单的事情就是不要理会 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 使更长的管道更容易;即便如此,上面的函数可能更简单一些。