当 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
可能会有帮助。
我刚刚用 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
可能会有帮助。