javascript - 在 Ramda 中组合函数,每个函数接收相同的值

标签 javascript functional-programming composition ramda.js

如果我想组合一系列函数,我可以使用 compose,这将允许我定义一系列函数,将一个或多个参数传递给第一个,然后返回值第一个传递给第二个,第二个的返回值传递给第三个,依此类推...

compose(f3, f2, f1)(value);

相当于:

f3(f2(f1(value)))

但是,如果我想用 value 调用所有三个函数怎么办?

我的用例是我有一系列验证数据的函数。在每种情况下,如果值有效,函数要么抛出不执行任何操作的错误。我需要以这样一种方式组合这些验证函数,即传入一个值将导致每个函数按顺序调用该值。有效地:

f1(value);
f2(value);
f3(value);
// Do something now we are sure the value is valid.

我能看到使用 ramda 提供的函数执行此操作的唯一方法是使用逻辑运算符来防止在值返回 false 时发生短路:

const f1 = (v) => console.log(`f1 called with '${v}'`);
const f2 = (v) => console.log(`f2 called with '${v}'`);
const f3 = (v) => console.log(`f3 called with '${v}'`);

const callAll = compose(complement, anyPass);
callAll([f1, f2, f3])('x');

REPL

然而,这感觉像是对 anyPass 的误用。这是实现我想要的最合适的方法吗?

最佳答案

However, what if I want all three functions to be called with value?

一个 值上运行多个函数的函数称为R.converge .

R.converge(
  () => {},
  [f1, f2, f3],
)('x');

第二个参数是一个函数数组。值(在本例中为“x”)按顺序放入其中。

但是在那之后,R.converge 获取 f1、f2、f3 的返回值并将它们作为第一个参数的参数抛出。您不需要 R.converge 的那部分,因为您没有对返回值做任何事情,所以您可以只使用一个什么都不做的函数。

因此,一个 callAll 可以写成:

const callAll =
  R.converge(() => {});

执行方式如下:

callAll([f1, f2, f3])('x');

或非柯里化(Currying):

const callAll =
  R.uncurryN(2, R.converge(() => {}));

callAll([f1, f2, f3], 'x');

Run with REPL

关于javascript - 在 Ramda 中组合函数,每个函数接收相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572808/

相关文章:

Javascript Fetch API 太快;在第二个 HTTP(获取 api)请求之前完成

java - RxJava - groupBy、toMap 和 flatMap 不能很好地协同工作?

EclipseFP 不工作

python - 你能在Python中动态地将多个条件函数组合成一个吗?

c++ - 类之间的关系——继承和组合

java - 基类的运行时确定

javascript - 组件上的 TouchableNativeFeedback 不执行 onPress 函数

javascript - 重命名 webpack AMD 输出中的定义函数

没有 Prism 的 WPF UI 组合

javascript - 处理 Promise.all 中的错误