compose 函数:
    将需要嵌套执行的函数平铺;
    嵌套执行指的是,一个函数的返回值将作为另一个函数的参数;
    实现函数式编程中的Pointfree,使我们专注于转换而不是数据;

    1. //第一种写法
    2. var caculate = x => (x+10)*10;
    3. console.log(caculate(10));
    4. //第二种写法
    5. let add = x => x+10;
    6. let multiple = y => y*10;
    7. console.log(multiple(add(10)));
    8. //第三种写法(虽然具备了compose函数的基本功能,但是只能有两个函数作为参数)
    9. let compose1 = (f, g)=>{
    10. return function(x) {
    11. return f(g(x));
    12. }
    13. };
    14. let composeFun = compose1(multiple, add);
    15. console.log(composeFun(10));

    通用compose函数实现:

    1. // 通用compose函数
    2. let compose = function(){
    3. let args = [].slice.call(arguments);
    4. return function(x){
    5. return args.reduceRight(function(res, callback){
    6. return callback(res);
    7. }, x);
    8. };
    9. };
    10. var cal = compose(multiple, add);
    11. console.log(cal(11));

    pipe函数:
    pipe函数和compose类似,只是数据流从左向右。

    1. var pipe = function(){
    2. var args = [].slice.call(arguments);
    3. return function(x){
    4. return args.reduce(function(res, callback){
    5. return callback(res);
    6. },x);
    7. }
    8. }
    9. var add = x => x+1;
    10. var multiple = y => y*10;
    11. var subtract = z => z-20;
    12. var cal = pipe(add, multiple,subtract);
    13. console.log(cal(100));

    学习代码:

    1. /**
    2. * Compose Function from right to left
    3. * compose(a,b,c) = (...args) => a(b(c(...args)));
    4. *
    5. * 在數學中,複合函數(英語:function composition)是指逐點地把一個函數作用於另一個函數的結果,
    6. * 所得到的第三個函數。例如,函數 f : X → Y 和 g : Y → Z 可以複合,得到從 X 中的 x 映射到 Z 中 g(f(x)) 的函數。
    7. * 直觀來說,如果 z 是 y 的函數,y 是 x 的函數,那麼 z 是 x 的函數。
    8. * 得到的複合函數記作 g ∘ f : X → Z,定義為對 X 中的所有 x,(g ∘ f )(x) = g(f(x))。[note 1] 直觀地說,
    9. * 複合兩個函數是把兩個函數連結在一起的過程,內函數的輸出就是外函數的輸入。 by: https://zh.wikipedia.org/wiki/复合函数
    10. *
    11. *
    12. * usage:
    13. * - Redux, compose(Middleware)
    14. * - React const TodoList = compose(Container, List, R.map(ListItem), items);
    15. *
    16. * @param {Array[Function]} funcs
    17. */
    18. export default function Compose(...funcs) {
    19. if (funcs.length === 0) {
    20. return arg => arg;
    21. }
    22. return funcs.reduceRight((a, b) => (...args) => a(b(...args)));
    23. }

    pipe:

    1. /**
    2. * pipe Function from left to right
    3. * pipe(a,b,c) = (...args) => c(b(a(...args)));
    4. *
    5. * 代数计算, 符合阅读习惯, 从左到右.
    6. *
    7. * 请实现一个pipe函数,并且保证pipe.test.js通过
    8. *
    9. * @param {Array[Function]} funcs
    10. */
    11. export default function pipe(...funcs) {
    12. if (funcs.length === 0) {
    13. return (arg) => arg;
    14. }
    15. return funcs.reduce((a, b) => {
    16. return (...args) => {
    17. return b(a(...args));
    18. }
    19. });
    20. }