(R.any)是否都有可变参数版本?

web*_*ath 5 javascript functional-programming variadic-functions ramda.js

我需要的可变版本R.either。在网上搜索后,我没有找到解决方案。R.anyPass可以,但是它返回一个布尔值而不是原始值。是否已经有我忽略的解决方案?如果没有,那么编写可变参数的两个效用函数的最佳方法是什么?

一个例子:

const test = variadicEither(R.multiply(0), R.add(-1), R.add(1), R.add(2))
test(1) // => 2 
Run Code Online (Sandbox Code Playgroud)

cus*_*der 4

reduce您可以使用+的组合reduced

const z = (...fns) => x => reduce((res, fn) => res ? reduced(res) : fn(x), false, fns);

console.log(
  z(always(0), always(10), always(2))(11),
  z(always(0), always(''), always(15), always(2))(11),
)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {reduce, reduced, always} = R;</script>
Run Code Online (Sandbox Code Playgroud)


(之前的尝试)

我会做这样的事情:

const z = unapply(curry((fns, x) => find(applyTo(x), fns)(x)));

console.log(

  z(always(0), always(15), always(2))(10),
  z(always(0), always(''), always(NaN), always(30), always(2))(10),

);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {unapply, curry, find, applyTo, always} = R;</script>
Run Code Online (Sandbox Code Playgroud)

但对此有三个主要警告!

  1. 你必须调用z两个“pass”,即z(...functions)(x)
  2. 虽然应该很容易添加,但我不关心没有函数“匹配”的情况
  3. 也许没什么大不了的,但值得注意:匹配的谓词将被执行两次