为什么 R.all 与 R.both 不等于 R.allPass 具有相同的参数?

Why does R.all with R.both does not equal R.allPass with the same arguments?

我只是边做边学ramda.js。嗯,有很多方法可以用 ramda 达到目标,但有一点我不明白。

我想检查一组字符串的输入,这些字符串都匹配一个正则表达式。我以为我可以做到 R.all(R.both(isString, isRegExp)),但当输入是数字时它似乎提供了 true。 正如预期的那样,R.allPass([isString, isRegExp]) 给出了带有数字输入的 false

但是谁能解释一下为什么 R.all 返回的是 true?或者(思考中)错误的地方是什么?

完整代码:

var isString = R.is(String),
  isMyRegExp = R.test(/^[a-z]+$/),
  isMyRegExpString = R.both(isString, isMyRegExp),
  isArrayOfMyRegExpStrings = R.all(isMyRegExpString),
  isArrayOfMyRegExpStringsPass = R.allPass([isString, isMyRegExp]),
  result = {
    'all': isArrayOfMyRegExpStrings(9),
    'allPass': isArrayOfMyRegExpStringsPass(9)
};
console.log(result);

// {
//   all: true,
//   allPass: false
// }

https://codepen.io/Eisenhardt/pen/PKLZqj

PS: 我知道我可以只用正则表达式来缩短条件,但在其他情况下我需要两个条件都为真。例如。 isArrayOfNumber 和 sumOfNumbersOver50。

R.all 的第二个参数需要要测试的值列表。由于该函数的实现方式,它将您示例中的 9 视为一个空列表,导致 vacuous truth 并评估为 true.