【问题标题】:Passing multiple arguments and result of last function through pipe通过管道传递多个参数和最后一个函数的结果
【发布时间】:2020-04-03 18:30:33
【问题描述】:

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

【问题讨论】:

标签: ramda.js


【解决方案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,以便更轻松地处理更长的管道;即便如此,上面的内容对于一些功能来说可能更简单。

【讨论】:

  • 您可能是对的 :) 但是,我正在构建的管道将具有更多功能。管道将使其保持可读性,我希望...
【解决方案2】:

我能想到几个解决方案:

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

这里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);

【讨论】:

  • 您的第一个解决方案完全符合我的预期,对我来说似乎很干净。
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2010-11-03
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多