咖喱和咖喱之间的差异在Lodash中

时间:2018-01-05 10:47:05

标签: javascript functional-programming lodash currying

Lodash中currycurryRight之间有什么区别?

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

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

1 个答案:

答案 0 :(得分:5)

来自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);中将arity指定为3。我不知道为什么,但如果没有它就会引起异常。