Ramda - R.Both的功能采用不同数量的参数

时间:2017-12-08 16:29:36

标签: javascript ramda.js

刚学习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)

2 个答案:

答案 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)))

但我觉得原版更容易阅读。