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

时间:2017-06-12 03:16:40

标签: javascript ecmascript-6 ramda.js

我刚刚用Ramda函数观察到这种行为,并且不太了解它。对于以下二进制函数

      $scope.stopTime = $interval(updateTime, 1000);

      $scope.on('$destroy', function() {
        $interval.cancel($scope.stopTime);
      });

当给出两个参数时,例如,

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

按预期返回t1(1)({})

但是,如果这样调用

{}

它会返回t1(1)()

这里到底是怎么回事?第二个参数是默认为某个东西,还是被视为从未提供过?

Ramda是否有办法明确设置第二个参数的默认值(例如[Function: f1])?

1 个答案:

答案 0 :(得分:3)

嗯,首先,我不了解你的功能。 R.cond([ [R.T, R.identity] ] )是一种稍微奇怪的方式来编写基本上是身份函数的东西。 cond通常需要多个谓词 - 操作对,通常使用谓词R.T作为默认值(类似于default语句的switch情况。)< / p>

(a) => R.cond([ [R.T, R.identity] ] )中包含它只是给你一个函数,你传递任何你喜欢的参数,这些参数会被迅速忽略,并返回那个奇怪的身份函数。

与Ramda创建的许多函数一样,cond的输出是 curried 函数,使用Ramda扩展的currying概念,您可以在其中调用各种函数方法。例如,如果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)会返回奇怪的身份R.cond([ [R.T, R.identity] ] )。因为这个函数是curry,如果你在没有参数的情况下调用它,你会得到与同一个标识函数相同的东西。

这应该解释为什么函数的行为与它一样。我不能说出你要解决的根本问题,所以我不知道如何帮助......

除非你提到违约,否则Ramda的defaultTo可能会有所帮助。