我尝试使用 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/