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));}});}
