我需要一个可变版本R.either
。在网上搜索一番后,我还没有找到解决方案。R.anyPass
可以工作,但它返回一个布尔值而不是原始值。是否已经有我忽略的解决方案?如果不是,那么编写可变参数实用函数的最佳方法是什么?
一个例子:
const test = variadicEither(R.multiply(0), R.add(-1), R.add(1), R.add(2))
test(1) // => 2
您可以使用以下组合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),
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {reduce, reduced, always} = R;</script>
(之前的尝试)
我会做这样的事情:
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),
);
<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>
但对此有三个主要警告!
- 你必须打电话
z
分两次“通过”,即z(...functions)(x)
- 虽然应该很容易添加,但我不关心没有函数“匹配”的情况
- 也许没什么大不了的,但值得注意:匹配的谓词将被执行两次
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)