ramda.js 中的 _curry1() 有什么意义?

What's the point of _curry1() in ramda.js?

我正在阅读 Ramda 的源代码,不明白 _curry1() 的要点。

function _curry1(fn) {
  return function f1(a) {
    if (arguments.length === 0 || _isPlaceholder(a)) {
      return f1;
    } else {
      return fn.apply(this, arguments);
    }
  };
}

使用此函数柯里化的函数可以在不带参数的情况下调用。

const inc = (n) => n + 1
const curriedInc = _curry1(inc)

// now it can be called like this
curriedInc(1)   // => 2
curriedInc()(1) // => 2

// but it works only with no arguments provided
const add = (a, b) => a + b
const curriedAdd = _curry1(add)

curriedAdd(1)     // => NaN
curriedAdd(1)(1)  // => TypeError: curriedAdd(...) is not a function
curriedAdd()      // => function f1(a)

问题: 在我看来,您根本无法将参数与此函数链接起来。此功能的用例是什么? curriedInc()(1)inc(1) 有何不同?

_curry1_curry2_curry3 是性能提升技巧,不能在 public curry 函数中使用。 Ramda(免责声明:我是作者)使用它们来执行多项任务,显然主要是执行柯里化,但也检查占位符以便我们可以正确地执行一些部分应用程序。 Ramda 柯里化的另一个神奇之处在于,您可以应用所有、部分甚至 none 所需参数的方式,只要我们还没有完成,您就会返回另一个函数来寻找剩余的参数.

显然 _curry1 理论上没有必要,但添加这种一致性更容易:

const a = curry ((a, b, c) => ...)
a (1, 2, 3) == a (1, 2) (3) == a (1) (2, 3) == a (1) (2) (3) == a () () (1, 2) () (3)

注意最后一个。当你调用一个柯里化函数时仍然在寻找参数而根本没有参数,你会得到相同的函数。

curry1 是让这一切发生的原因;它增加了一致性。但仅此而已。