我正在学习使用Ramda并遇到过compose。但我无法把握它的目的
let value = R.compose( calledThird, calledSecond, calledFirst('hello') );
// vs
let value = calledThird( calledSecond( calledFirst('hello') ) );
纯粹是允许欺骗吗?可能...
let curried = R.compose( calledThird, calledSecond, calledFirst );
curried('hello');
还有其他目的吗?
您的第二个示例正是这样做的原因,尽管实际上这与curring无关。
功能组合使您可以从更简单的功能中构建更复杂的功能。
假设您有一些需要排序的数据类型,例如约会的集合。假设您已经具有一个sortByDate
函数和一个reverse
函数,则可以编写sortByDateDescending
为
var sortByDateDescending = function(appointments) {
return reverse(sortByDate(appointments));
}
或在ES6中:
const sortByDateDescending = appointments => reverse(sortByDate(appointments));
这没有错。但是,如果您要用一个compose
助手来编写它,它有几个优点:
var sortByDateDescending = compose(reverse, sortByDate);
首先,它显然更短,并且随着您添加更多功能(尤其是使用es6之前的代码)时,差异将变得更大。
但更重要的是,这使您可以专注于有意义的事情。您正在此处合并功能;最终将要传递的数据是目标,但是在构建新功能时,主要是分散注意力。
通过这种方式编写,您可以专注于发生的事情:按日期对列表进行排序,然后反转结果。
更加专注于函数式编程的语言使这一过程变得更加简单,使用了一个不引人注目的运算符,而不是像这样的函数compose
。在Haskell中,等效项看起来像
sortByDateDescending = reverse . sortByDate
但是Javascript无法提供这种优雅。我们能做的最好的事情就是创建类似的函数compose
(或它的反序双胞胎pipe
。)。
顺便说一句,咖喱完全是另一回事。这是一种使在此类合成中重用功能更加容易的技术。但这主要是分散注意力。如果你有兴趣,我也有一个岗位上的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句