compose 函数:
将需要嵌套执行的函数平铺;
嵌套执行指的是,一个函数的返回值将作为另一个函数的参数;
实现函数式编程中的Pointfree,使我们专注于转换而不是数据;
//第一种写法
var caculate = x => (x+10)*10;
console.log(caculate(10));
//第二种写法
let add = x => x+10;
let multiple = y => y*10;
console.log(multiple(add(10)));
//第三种写法(虽然具备了compose函数的基本功能,但是只能有两个函数作为参数)
let compose1 = (f, g)=>{
return function(x) {
return f(g(x));
}
};
let composeFun = compose1(multiple, add);
console.log(composeFun(10));
通用compose函数实现:
// 通用compose函数
let compose = function(){
let args = [].slice.call(arguments);
return function(x){
return args.reduceRight(function(res, callback){
return callback(res);
}, x);
};
};
var cal = compose(multiple, add);
console.log(cal(11));
pipe函数:
pipe函数和compose类似,只是数据流从左向右。
var pipe = function(){
var args = [].slice.call(arguments);
return function(x){
return args.reduce(function(res, callback){
return callback(res);
},x);
}
}
var add = x => x+1;
var multiple = y => y*10;
var subtract = z => z-20;
var cal = pipe(add, multiple,subtract);
console.log(cal(100));
学习代码:
/**
* Compose Function from right to left
* compose(a,b,c) = (...args) => a(b(c(...args)));
*
* 在數學中,複合函數(英語:function composition)是指逐點地把一個函數作用於另一個函數的結果,
* 所得到的第三個函數。例如,函數 f : X → Y 和 g : Y → Z 可以複合,得到從 X 中的 x 映射到 Z 中 g(f(x)) 的函數。
* 直觀來說,如果 z 是 y 的函數,y 是 x 的函數,那麼 z 是 x 的函數。
* 得到的複合函數記作 g ∘ f : X → Z,定義為對 X 中的所有 x,(g ∘ f )(x) = g(f(x))。[note 1] 直觀地說,
* 複合兩個函數是把兩個函數連結在一起的過程,內函數的輸出就是外函數的輸入。 by: https://zh.wikipedia.org/wiki/复合函数
*
*
* usage:
* - Redux, compose(Middleware)
* - React const TodoList = compose(Container, List, R.map(ListItem), items);
*
* @param {Array[Function]} funcs
*/
export default function Compose(...funcs) {
if (funcs.length === 0) {
return arg => arg;
}
return funcs.reduceRight((a, b) => (...args) => a(b(...args)));
}
pipe:
/**
* pipe Function from left to right
* pipe(a,b,c) = (...args) => c(b(a(...args)));
*
* 代数计算, 符合阅读习惯, 从左到右.
*
* 请实现一个pipe函数,并且保证pipe.test.js通过
*
* @param {Array[Function]} funcs
*/
export default function pipe(...funcs) {
if (funcs.length === 0) {
return (arg) => arg;
}
return funcs.reduce((a, b) => {
return (...args) => {
return b(a(...args));
}
});
}