• [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),
      [],
    ); /*?*/
  • 相关阅读:
    CPU、内存、硬盘、指令之间的关系
    hadoop配置
    python logging
    python 多线程一(lock)
    Python+OpenCV图像处理(七)—— 滤波与模糊操作
    Python+OpenCV图像处理(六)—— ROI与泛洪填充
    Python+OpenCV图像处理(五)—— 像素运算
    The MathType Dll cannot be found 问题解决办法
    Python+OpenCV图像处理(四)—— 色彩空间
    Python+OpenCV图像处理(三)—— Numpy数组操作图片
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8297876.html
Copyright © 2020-2023  润新知