弁言
在fp编程中,compose是一个主要运用场景,下面议论一些个人明白。
const R=require('ramda');
const data=[{
name:'gcy',
sex:'male'
},{
name:'ycg',
sex:'female'
}]
const getName=R.compose(
R.map(d => d.name),
R.filter(d => d.sex=='male')
);
console.log(getName(data));
申明 数据和操纵解耦,笼统化的功用函数组件更容易复用和保护。
上面filter做到了只接收谓词函数作为唯一束缚,自在变量是怎样被过滤,这涉及到curry,以下所示。
var _ = require('lodash');
const Rfilter=function (predicate) {
return function (data) {
return _.filter(data,predicate);
}
}
console.log(Rfilter( d => d.name=='gcy')(data));
申明 curry一言以蔽之就是为每一个参数返回一个函数。优点是能够依靠通明,无视察副作用,哈哈,实在一切fp纯函数都有这个特征,其次简化函数运用难度(相对来说,为curry而curry就得不偿失了)和轻易compose。
const {comp,pipeline,partial,inc,filter,sort}=require('mori');
const todos=[{
name:'g1',
age:'20'
},{
name:'g2',
age:'21'
},{
name:'g1',
age:'22'
}];
const sortByname=partial(sort,(x,y) => x.name<y.name);
const filterByAge= partial(filter,x => x.age>=21);
console.log(pipeline(todos,filterByAge,sortByname))
申明 不管一般的compose,partial,照样curry可读性都不好,上面既具有组合性,同时管道式的浏览体式格局看起来顺畅,而不是自内向外,自右向左的函数式组合读法。
总结
经由过程已有的函数举行组合,最大水平的复用已有函数,须要提早构想好笼统单位函数。近来挺忙的,保护一后端写的代码A(){B()|C()},B(){C()},C(){D()}都是些全局函数,然后依靠一些全局变量,有极大的视察副作用,同时没有模块化,零件无构造的散落个各个文件中,典范的反例,感想颇深(>﹏<)。