[Javascript] Improve Composition with the Compose Combinator

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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),
  [],
); /*?*/

 

以上是关于[Javascript] Improve Composition with the Compose Combinator的主要内容,如果未能解决你的问题,请参考以下文章

javascript Buttonify.js。请参阅comp-demo-5.html。

javascript APP-2.js。请参阅comp-demo-4.html。

javascript HelloWorld2.js。请参阅comp-demo-4.html。

javascript HelloWorld1.js。请参阅comp-demo-2.html。

源码ImProve:嵌入Haskell的命令式编程语言

smaller programs should improve performance