tho*_*ter 4 javascript functional-programming ramda.js
我正在学习使用Ramda,并且遇到了写作.但我无法理解它的目的
let value = R.compose( calledThird, calledSecond, calledFirst('hello') );
// vs
let value = calledThird( calledSecond( calledFirst('hello') ) );
Run Code Online (Sandbox Code Playgroud)
是纯粹允许currying吗?也许...
let curried = R.compose( calledThird, calledSecond, calledFirst );
curried('hello');
Run Code Online (Sandbox Code Playgroud)
还有其他目的吗?
Sco*_*yet 11
你的第二个例子正是它的原因,尽管这实际上与currying无关.
功能组合允许您使用更简单的功能构建更复杂的功能.
想象一下,你有一些你需要排序的数据类型,让我们说一组约会.鉴于您已经拥有一个sortByDate
函数和一个reverse
函数,您可以编写sortByDateDescending
为
var sortByDateDescending = function(appointments) {
return reverse(sortByDate(appointments));
}
Run Code Online (Sandbox Code Playgroud)
或者在ES6中:
const sortByDateDescending = appointments => reverse(sortByDate(appointments));
Run Code Online (Sandbox Code Playgroud)
这没什么不对.但是如果你用compose
帮助器编写它,它有几个优点:
var sortByDateDescending = compose(reverse, sortByDate);
Run Code Online (Sandbox Code Playgroud)
首先,它显然更短,并且随着您添加更多功能,差异将变得更加充实,特别是使用pre-es6代码.
但更重要的是,这可以让你专注于有意义的事情.你在这里组合功能 ; 最终将通过的数据是目标,但是当您构建新功能时,它主要是分散注意力.
通过这种方式编写,您可以专注于正在发生的事情:您按日期对列表进行排序,然后您正在反转结果.
更加专注于函数式编程的语言使这个更简单,使用一个不显眼的运算符而不是像这样的函数compose
.在Haskell中,等价物看起来像
sortByDateDescending = reverse . sortByDate
Run Code Online (Sandbox Code Playgroud)
但Javascript并没有提供那种优雅.我们能做的最好的事情就是创建像compose
(或者它的顺序反转的双胞胎,... pipe
)这样的函数.
顺便说一句,干脆是一个完全不同的野兽.这种技术使得在这种组合物中重用功能变得容易得多.但这主要是分散注意力.如果你有兴趣,我也有一个关于这个问题的帖子.
归档时间: |
|
查看次数: |
303 次 |
最近记录: |