刚学习Ramda并发现我一直在遇到同样的情况。我有2个条件函数,我想用R.both评估。扭曲是1功能需要额外的参数。类似的东西:
const condition1 = (y) => y===1;
const condition2 = (x, y) => x===y;
const validator = R.both(condition1, condition2)
请注意,条件2的参数已切换。如果我知道将x
首先应用,这可以正常工作。但如果它不是什么呢?
我:
1)改变条件1,如const conditionAltered = () => condition1
2)使用一些Ramda函数来做同样的事情(不确定会是什么)
3)????
寻找最佳实践"输入答案。
好的,事实证明我完全误解了R.both
的运作方式。首先,我认为它会自动调整传递的条件,然后我没有意识到它是短路的。
鉴于我的(1)应该阅读const conditionAltered = (x, y) => condition1(y)
答案 0 :(得分:1)
不确定,如果问题中的条件是正确的,但我会尽力给出解决方案。
让上述条件如下。
const condition1 = (x) => x === 2;
const condition2 = (x, y) => x > y;
要检查这两个条件,您可以
const validator = R.both(condition1, condition2);
validator(2, 1) // return `true`
现在,如果要反转condition2
的参数,那么您可以执行以下操作
const condition1 = (x) => x === 2;
const condition2 = (y, x) => x > y;
const validator = R.both(condition1, R.flip(condition2));
validator(2, 1) // return `true`
注意,我添加了R.flip()
来翻转参数。
答案 1 :(得分:1)
正如Vipin Kumar演示的那样,你可以翻转一个函数的参数,但是如果它有你想要的顺序,那么你可以改变另一个函数。
const evenWidth = (width) => width % 2 === 0
const tall = (height, width) => height > width
// (width, height) => boolean
const evenTall = both(evenWidth, flip(tall))
// (height, width) => boolean
const tallEven = both(tall, (_, width) => evenWidth(width))
如果你真的想要后者的无点版本,你可以这样做:
const tallEven = both(tall, compose(evenWidth, nthArg(1)))
但我觉得原版更容易阅读。