我尝试使用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(...)(...)不是函数
答案 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 上看到这些内容。