conditional-statements - lambda : condition statement issue

标签 conditional-statements ramda.js

我尝试使用 R.cond 设置条件语句。首先,我根据输入获取数组大小(即[1,2,3]),然后检查数组大小是否大于/等于输入大小(即3)。但我收到一条错误消息。我想知道为什么会出现这个错误以及如何修复它,谢谢。

R.cond([
  [R.compose(R.gte, R.length), () => {console.log(1)}],
  [R.T, () => {console.log(2)}]
])([1,2,3])(3)

错误消息:R.cond(...)(...) 不是函数

最佳答案

我认为这里有两个不同的问题。首先,因为绝大多数对 cond 函数的调用都是一元的,所以它不会柯里化(Currying)结果。

所以你不能将其称为(...)([1,2,3])(3)。您需要执行(...)([1,2,3], 3)

但这并不能解决其他问题。

compose(及其孪生pipe)在第一次调用时确实采用多个参数,但之后它们之间只传递一个参数。因此,传递给 gte 的唯一值是 length 的结果。

您可以通过多种方式解决此问题。也许最简单的是:

const fn = R.cond([
  [(list, len) => list.length >= len, always(1)],
  [R.T, always(2)]
]);

fn([1, 2], 3); //=> 2
fn([1, 2, 3], 3); //=> 1

(请注意,我将您的 console.log 更改为返回值的函数。)

如果你想免积分,你可以改用 Ramda 的 useWith像这样:

const fn = R.cond([
  [R.useWith(R.gte, [R.length, R.identity]), always(1)],
  [R.T, always(2)]
]);

但正如经常发生的那样,我认为箭头函数的引入使得像 useWith 这样的工具不太有用。我发现早期版本更具可读性。

您可以在 Ramda REPL 上看到这些操作的实际情况。

关于conditional-statements - lambda : condition statement issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42249624/

相关文章:

java - for循环中的条件表达式未按预期运行

javascript - Ramda 建议从稍微嵌套的数组中删除重复项

javascript - 使用 Ramda 增加映射数组中的数字

javascript - lambda js : lens for deeply nested objects with nested arrays of objects

javascript - 在函数式编程中什么时候选择无点风格与以数据为中心的风格比较合适?

javascript - 如何创建动态 if 条件

mysql - 不同的条件选择不同的语句

MySQL - 优化 OR 语句

javascript - 如何简化多个if语句javascript?

javascript - ramda 过滤器仅返回第一个结果