Ramda:条件语句问题

Ramda: condition statement issue

我尝试使用 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 函数的绝大多数调用都是一元的,所以它不会柯里化结果。

所以你不能称它为(...)([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 更改为 returns 一个值的函数。)

如果你想做这个 points-free,你可以像这样切换到使用 Ramda 的 useWith

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

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

您可以在 Ramda REPL.

上看到这些正在运行的内容