Ramda:条件陈述问题

时间:2017-02-15 12:36:27

标签: conditional 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(...)(...)不是函数

1 个答案:

答案 0 :(得分:2)

我认为这里有两个不同的问题。首先,因为对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更改为返回值的函数。)

如果你想让这一点免费,你可以切换到像这样使用Ramda的useWith

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

但正如经常发生的那样,我认为引入箭头功能会使useWith之类的工具变得不那么有用。我发现早期版本更具可读性。

您可以在 Ramda REPL 上看到这些内容。