関数型プログラミングとパイプ-compose

一つの機能プログラミングモデルは、複数の機能の組み合わせの組み合わせ機能の機能により実現されます。一般的な関数型プログラミング支援ツールマガジンは、一般的に、パイプを構成するために呼ばれる、このモードを達成しています。既知のタイプの関数としてRAMDAの例えば、ツールのライブラリを。

const R = require('ramda');
function inc (num) {
  return ++num;
}
const fun1 = R.compose(Math.abs, inc, Math.pow)
const fun2 = R.pipe(Math.pow, Math.abs, inc)
console.log(fun1(-2, 3)) 
console.log(fun2(-2, 3)) 

上記の例から分かるように、それが想定されfgh3つの機能を表し、compose(f,g,h)関数戻り、同様の実行(...args) => f(g(h(...args)))機能を。すなわち、上記の関数の値の関数として、リターンパラメータを右から左へ、複数の機能の組み合わせ、pipe(f,g,h)機能戻り、同様の実行(...args) => h(g(f(...args)))前の関数の関数として、即ち左から複数の機能の適切な組み合わせに、戻り値を関数をパラメータ;最初に実行されるように期待される機能は、機能は、単一の引数を取り後の推定パラメータの任意の数を受け入れることができます。入れてcompose、それは数学的な意味での複数の右から左への操作を反映しているため話の前に。
reduxそれはであるcompose高めるために、アプリケーション機能store

import { createStore, applyMiddleware, compose } from 'redux'
import thunk from 'redux-thunk'
import DevTools from './containers/DevTools'
import reducer from '../reducers'
const store = createStore(
  reducer,
  compose(
    applyMiddleware(thunk),
    DevTools.instrument()
  )
)

一般的にcompose及びpipe機能のシーケンスを受信する機能、および機能を返し、アレイ使用reduce方法が簡単にこれらの二つの機能を実現することができ、以下の通りであるreduxソースコードcompose方式の実装。

function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

上記のコードはES6 +実装され、コードは、ES5の上記書き込み実装方法に従うことは容易です

function _compose(f, g) {
  return function() {
    return f.call(this, g.apply(this, arguments));
  };
}

function compose() {
  var args = Array.prototype.slice.call(arguments)
  if (args.length === 0) {
    return function(arg){
      return arg
    }
  }
  if (args.length === 1) {
    return args[0]
  }
  return args.reduce(_compose)
}

達成するためcomposeの方法を、唯一の我々は実現することができるであろういくつかの場所を変更する必要があるpipe方法を。

function pipe(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => b(a(...args)))
}

それともによる直接compose達成する方法pipe

function pipe(...funcs){
  if(funcs.length === 0) {
    return arg => arg
  }
  return compose(...funcs.reverse())
}

コンセプトは、数学の組み合わせから来て、重要な機能を有している連想


var associative = compose(f, compose(g, h)) == compose(compose(f , g), h); 

結合則に沿って関係なく、あなたが入れていることを意味gし、  hグループに割り当てられた、またはにfし、gグループに割り当てられては重要ではありません。実際の開発プロセスでは、我々は、単一の原則に沿ったものでもあり、パフォーマンス機能、可能な限り最小限に抑えることができ、その後、大規模な組み合わせを組み合わせて機能要件を完了すること。

 

https://www.cnblogs.com/star91/p/han-shu-shi-bian-chengcompose-yupipe.html

おすすめ

転載: www.cnblogs.com/feng9exe/p/11014972.html