当 Ramda 函数被赋予空参数时会发生什么?

What happens when Ramda function is given empty parameter?

我刚刚用 Ramda 函数观察到这种行为,但不是很理解。对于以下二元函数

const t1 = (a) => R.cond([ [R.T, R.identity] ] );

当两个参数都给定时,例如

t1(1)({})

它 returns {} 符合预期。

但是,如果这样调用

t1(1)()

它returns一个[Function: f1]

这里到底发生了什么?第二个参数是被默认为某个东西,还是被视为从未提供过?

Ramda 中有没有办法显式设置第二个参数的默认值(例如 {})?

嗯,首先,我不明白你的功能。 R.cond([ [R.T, R.identity] ] ) 是一种写本质上是恒等函数的稍微奇怪的方式。 cond 通常采用多个谓词-动作对,通常使用谓词 R.T 作为最后一个作为默认值(类似于 switch 语句的 default 情况。)

将其包装在 (a) => R.cond([ [R.T, R.identity] ] ) 中只是为您提供了一个函数,您可以向其传递您喜欢的任何参数,这些参数会立即被忽略,从而返回那个奇怪的身份函数。

与 Ramda 创建的许多函数一样,cond 的输出是一个 curried 函数,使用 Ramda 的扩展柯里化概念,您可以在其中调用函数各种方式。例如,如果 g = curry(function f(a, b, c) {/* ... */}),那么所有这些都等同于 f(a, b, c):

g(a, b, c)
g(a, b)(c)
g(a)(b, c)
g(a)(b)(c)

如果你调用的参数少于完整的参数,你会得到另一个函数:

g(a); //~> curry((b, c) => f(a, b, c))
g(a, b); //~> curry((c) => f(a, b, c))

这甚至扩展到根本不提供任何参数:

g(); //~> curry((a, b, c) => f(a, b, c)),

最后这就是您所注意到的。 t1(1)returns那个奇怪的身份,R.cond([ [R.T, R.identity] ] )。因为这个函数是柯里化的,所以如果你不带参数调用它,你会得到等同于同一恒等函数的东西。

这应该可以解释为什么函数的行为如此。我不知道你要解决什么根本问题,所以我不知道如何帮助...

除了您提到的默认设置,Ramda 的 defaultTo 可能会有帮助。