zoukankan      html  css  js  c++  java
  • [Javascript] Improve Composition with the Compose Combinator

    To make our composition more readable and easier to name we are going to ceate a compose function we can use to avoid having to manually nest our transducer calls.

    We'll also go over semantically naming your compose functions for extra readability.

    Nested style:

    import {doubleTheNumber, evenOnly} from "../utils";
    
    const map = xf => reducer => {
      return (accumulation, value) => {
        return reducer(accumulation, xf(value));
      };
    };
    
    const filter = predicate => reducer => {
      return (accumulation, value) => {
        if (predicate(value)) return reducer(accumulation, value);
        return accumulation;
      };
    };
    
    const isEvenFilter = filter(evenOnly);
    const isNot2Filter = filter(val => val !== 2);
    
    const doubleMap = map(doubleTheNumber);
    
    const pushReducer = (accumulation, value) => {
      accumulation.push(value);
      return accumulation;
    };
    
    [1,2,3,4].reduce(isNot2Filter(isEvenFilter(doubleMap(pushReducer))), []);

    Compose function:

    import {filter, map, evenOnly, doubleTheNumber} from "../utils";
    
    const doubleMap = map(doubleTheNumber);
    const isEvenFilter = filter(evenOnly);
    const isNot2Filter = filter(val => val !== 2);
    const pushReducer = (accumulation, value) => {
      accumulation.push(value);
      return accumulation;
    };
    
    [1, 2, 3, 4].reduce(isNot2Filter(isEvenFilter(doubleMap(pushReducer))), []);
    
    // compose(f,g)(x) === f(g(x));
    //
    // compose(isNot2Filter, isEvenFilter, doubleMap)(pushReducer) ===
    // isNot2Filter(isEvenFilter(doubleMap(pushReducer)));
    
    const compose = (...functions) =>
      functions.reduce((accumulation, fn) =>
        (...args) => accumulation(fn(...args)), x => x);
    
    [1, 2, 3, 4].reduce(
      compose(isNot2Filter, isEvenFilter, doubleMap)(pushReducer),
      [],
    ); /*?*/
  • 相关阅读:
    sql语句查询结果排序
    Spring MVC 注解
    Spring MVC 编程流程步骤
    菜鸟学自动化测试(一)—-selenium IDE
    list和set的区别
    Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    是否可以从一个static方法内部发出对非static方法的调用?
    Shiro运行原理?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8297876.html
Copyright © 2011-2022 走看看