若干个纯函数、偏函数、柯里化函数组成一个新的函数,形成数据传递,并实现一种有序执行的效果
function toUpperCase(str) {
return str.toUpperCase();
}
function exclaim(str) {
return str + '!';
}
console.log(exclaim(toUpperCase('hello'))); // HELLO!
上述例子很明显不易读,我们可以使用高阶函数中的左倾来优化
function toUpperCase(str) {
return str.toUpperCase();
}
function exclaim(str) {
return str + '!';
}
// 组合函数 compose
function compose(f, g) {
// x是通过f g之间的'管道'来传输值
return function(x) { // 为了compose函数不直接执行f函数
return f(g(x)); // 这句话的执行方式是:左倾(函数的参数里执行了一个函数,这就叫做左倾)一个函数内部传入了一个参数,这个参数是函数执行,那么这个函数一定是左倾的
}
}
var f = compose(exclaim, toUpperCase);
console.log(f('hello')); // HELLO!
function toUpperCase(str) {
return str.toUpperCase();
}
function exclaim(str) {
return str + '!';
}
function split(str) {
return str.split('');
}
function reverse(str) {
return str.reverse();
}
function join(str) {
return str.join('-');
}
function compose2() {
// 将类数组arguments转换为数组
var args = Array.prototype.slice.call(arguments),
len = args.length - 1;
return function(x) {
// 执行最后一个函数
var res = args[len](x);
while(len --) {
res = args[len](res);
}
return res;
}
}
var f2 = compose2(join, reverse, split, exclaim, toUpperCase);
console.log(f2('hello')); // !-O-L-L-E-H
function compose2() {
var args = Array.prototype.slice.call(arguments);
return function(x) {
return args.reduceRight(function(res, cb) {
return cb(res);
}, x);
}
}
var f2 = compose2(join, reverse, split, exclaim, toUpperCase);
console.log(f2('hello')); // !-O-L-L-E-H
function split(str) {
return str.split('');
}
function reverse(str) {
return str.reverse();
}
function join(str) {
return str.join('-');
}
function compose2() {
var args = Array.prototype.slice.call(arguments);
return function(x) {
return args.reduceRight(function(prev, cur) {
return cur(prev);
}, x);
}
}
var f = compose2(join, reverse, split);
var f1 = compose2(compose2(join, reverse), split)
var f2 = compose2(join, compose2(reverse, split));
console.log(f('hello')); // o-l-l-e-h
console.log(f1('hello')); // o-l-l-e-h
console.log(f2('hello')); // o-l-l-e-h
Love means never having to say you’re sorry. (我觉得爱不需要说抱歉)
Excuse me.
Pointfree style means never having to say your data.(这种格式从不需要说自己的数据)