Lodash 中 curry 和 curryRight 的区别

Difference between curry and curryRight in Lodash

Lodash 中 currycurryRight 有什么区别?

是否只是将提供的参数的应用顺序从适用于 f(a) -> f(b) -> f(c)f(a,b,c) 切换为适用于 f(c) -> f(b) -> f(a)f(a,b,c)

我已经查看了 Lodash 文档,但这对我没有帮助。

来自documentation:

var abc = function(a, b, c) {
  return [a, b, c];
};

var curried = _.curryRight(abc);

curried(3)(2)(1);
// => [1, 2, 3]

curried(2, 3)(1);
// => [1, 2, 3]

curried(1, 2, 3);
// => [1, 2, 3]

第一个例子很简单。参数的顺序是相反的(与 _.curry 相比)。

第二个和第三个可能令人困惑。

在第三个示例中,我们看到参数的顺序没有颠倒。那是因为只有 currying 被反向应用。换句话说,括号以相反的顺序应用,但括号内的内容维持原始顺序。

将此与 _.curry(_.flip(f)) 的结果进行比较:

var abc = function(a, b, c) {
  return [a, b, c];
};

var curried = _.curry(_.flip(abc), 3);
    
curried(3)(2)(1);
// => [1, 2, 3]

curried(3, 2)(1);
// => [1, 2, 3]

curried(3, 2, 1);
// => [1, 2, 3]

如您所见,结果不同。现在所有例子中参数的顺序完全颠倒了。

顺便说一下,由于某种原因我需要在 _.curry(_.flip(abc), 3); 中将元数指定为 3。我不知道为什么,但没有它会导致异常。