関数式プログラミングとは何ですか.関数のマージとコリー化とはどういう意味ですか.

10354 ワード

関数式プログラミングが何年も耳に響いているので、今日は詳しく見てみましょう.
関数式プログラミングの主な特徴は、関数が一等公民であることです.純粋な関数、副作用のない関数を書くことをお勧めします.
純粋な関数の内容を議論した後、最も重要な応用:関数のコリー化を見ます.

純関数の概念


純粋な関数は、同じ入力であり、永遠に同じ出力が得られ、観察可能な副作用はありません.その副作用とは,関数外部環境とのインタラクションを指す.以下を含むが、これらに限定されない.
  • ファイルシステム
  • を変更
  • データベースにレコード
  • を挿入する.
  • httpリクエスト
  • を送信
  • 可変データ
  • 印刷/log
  • ユーザ入力
  • を取得する.
  • DOMクエリ
  • アクセスシステムステータス
  • 例えば、sliceは純粋な関数であり、spliceはそうではない.

    じゅんかんすうのさよう


    キャッシュ性

    var memoize = function(f) {
      var cache = {};
    
      return function() {
        var arg_str = JSON.stringify(arguments);
        cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
        return cache[arg_str];
      };
    };
    
    var squareNumber  = memoize(function(x){ return x*x; });
    squareNumber(4);
    //=> 16
    squareNumber(4); //            4    
    //=> 16
    

    注意すべき点は、実行を遅らせることで不純な関数を純粋な関数に変換することができることです.
    var pureHttpCall = memoize(function(url, params){
      return function() { return $.getJSON(url, params); }
    });
    

    移植性/ドキュメント化


    純粋な関数は依存に対して誠実で,その目的を知ることができる.必要な(可変な)パラメータをすべて渡すと言える.

    テスト可能性


    簡単に関数に入力すると、出力が出ます.

    合理性


    コードが実行された結果に置き換えられ、プログラム全体の動作を変更することなく置き換えられる場合、このコードは透明であると言います.これは、「等式導出」(equational reasoning)の技術を使用してコードを分析することができ、「一対一」で置き換えた場合に手動でコードを実行するため、コードを理解する上で非常に重要です.

    パラレルコード


    最後の点は、任意の純粋な関数を並列に実行できる決定的な点でもあります.純粋な関数は共有メモリにアクセスする必要がなく、その定義に基づいて、純粋な関数も副作用によって競合状態に入ることはありません.
    パラレルコードは、スレッド(thread)を使用するため、サービス側js環境およびweb workerを使用するブラウザで非常に容易に実現されます.しかし,非純粋な関数の複雑さを考慮すると,現在の主流の観点では,この並列の使用は避けられる.

    結合


    マージは、1つの値が複数の関数によって変化した最後の出力結果です.明らかにreduceの概念です.
    例えばa(b(c(d)))は気分が悪く、JSのコールバック地域のようにかっこが特に多い.したがって、compose関数があれば、式を[c, b, a].compose(d)と書くことができます.配列内の関数が純粋な関数であれば、結合則を満たすこともできます.
    function compose(array) {
      return function(args) {
        return array.reduce(function (total, f) {
          return f(total);
        }, args);
      }
    }
    

    または
    function compose(array) {
      return function(args) {
        let result = args;
        array.forEach(function(f) {
          result = f(result);
        });
        return result;
      }
    }
    
    

    コリー化


    Curryの概念は簡単です.関数の一部のパラメータにのみ渡されて呼び出し、残りのパラメータを処理するために関数を返します.
    function curry(fn) {
      return function finalCurry(...args) {
        if (args.length >= fn.length) {
          return fn(...args);
        } else {
          return function (...args2) {
            return finalCurry(...args, ...args2);
          }
        }
      }
    }