コンピュータ範疇論(javaScript実践版)第一篇


計画
  • まず、範疇論の理論を使ってコードを書く理由を説明します.
  • カテゴリー論の中のコンピュータ関連の知識を解説してください.
  • は2の言及した理論を少し応用します.
  • 実践して、新しい武器を持って戦闘力を高めましょう.
  • 第一章の目的
    このシリーズの文章を書く目的は何ですか?もちろん生産性向上です!これのためじゃなくて、誰がそんなに多くのものを発明しますか?それともGoogleのACM銀のお椀をもらうためだけですか?私たちは自分で勉強して作文を書くことから、重要な主旨を知っています.ははは、皮をむいた.ですから、私たちがよく知っているDRY(自分を繰り返さないでください)SR(単一の職責)LCHC(高凝集低結合)YAGNI(過度な開発を避ける)PLS(最小の意外原則)などは原則として説明していませんが、私たちのコード例はやはり彼らのものを守ります.
    第二章命令式と宣言式
    1.違い
    まず、コードの表記習慣の違いを見てみましょう.例としては、1つの配列の各数字を倍にして、結果を返すという意味です.
    //     
    var num=[1,2,3,4,5];
    var result=[];
    for(var i=0;i<num.length;i++){
      result.push(num[i]*2);
    }
    
    //     
    var num=[1,2,3,4,5];
    var result=num.map(x=>x*2);
    
    ほら、これは一行のコードがすべてを解決する時代です.
    2.新しい考え方
    命令式コードは、最後の仕事の結果まで、すべての作業手順を指示するための強力な人のようです.声明のコードはこんなに横暴ではありません.彼は彼の倍増の需要をコンピュータに教えました.コンピュータは需要を持って実行に行きました.
    同じ結果、異なる思考の角度は、異なるコード量をもたらします.
    コードの実行速度を捨てると、単に需要を実現するだけで、声明的な開発効率に圧倒されると思います.効率的に実行するコードを書く人は見ないほうがいいです.
    もし読者がmapの方法を理解しなくても大丈夫です.なにしろこれは範疇論の中で言及されたものですから、後でこれらの範疇論の計算における実現を紹介します.
    うん、私はまた新しい理論に言及したようです.読者たちは私を噴かないでください.私の学習方法は先に理論を導入してから実践します.このように勉強できるのは一番早い案だと思います.
    第三章関数
    1.関数
    最初のコンピュータプログラムの概念は「データ構造+アルゴリズム」です.この理念はもう長い間提出されました.コンピュータ業界でも憲法とされています.この理論を覆すつもりはないです.結局この理論は正しいです.アルゴリズムというものを突っ込みたいだけですが、今はどれぐらいの白さんが無駄な知的障害の維持が難しいアルゴリズムを書いていますか?このような人を見た時、彼に「私達」と言って軽蔑するしかないです.
    コンピュータ業界が数学の関数概念を引用してから、すべてが変わりました.コードブロックは初めて自分の意味を持ちました.方法名や方法によって注釈を付けると、それが一体なぜ存在するのかが分かります.例を見ます.
    // 
    var add = function(x, y) { return x + y };
    // 
    var multiply = function(x, y) { return x * y };
    
    なぜ直接入れないですか?それとも直接乗りますか?もう一つの方法を作ってきますか?これは余計なことじゃないですか?ここはただの例です.読者が焦らずに噴き出してください.簡単であればあるほど分かりやすくなります.抽象的すぎると、私は接地しないという人がいます.
    本題に戻ります.上の2つの方法は加えればいいです.このアルゴリズムを一つの方法にカプセル化しました.論理がもっと複雑であれば、アルゴリズムをパッケージ化したほうがいいです.誰も自分を繰り返したくないからです.
    2.純関数
    プログラムの経験が少しあれば、ここはきっと跳び越えられます.まず定義を言います.純関数は同じ入力で、いつまでも同じ出力が得られます.観察できる副作用はありません.
    もう一つの例を示します
    //    
    var a=1;
    var addA=function(b){a=a+b;return a;};
    
    addA法は純粋な関数ではなく、その結果はaの値に依存しているので、戻り値が何かを明確に知ることはできない.それ以外に、aの値は変更されました.一回の呼び出しの結果はやはり違います.あら、ここに二つのトラブルがあります.この職種をテストしたら、このコードのテストの難しさが分かります.
    //   
    var add=function(a,b){return a+b;};
    
    私たちはまた上のadd方法を使いました.今回のadd方法の結果は彼の入力パラメータだけと関連しています.戻り結果を明確に知ることができます.そして、簡単にコードテストができます.高凝集低結合とはこのような期待ではないですか?
    3.高次関数
    高次関数とは、少なくとも次の条件を満たす関数のことです.1、関数はパラメータとして伝達されます.2、関数は戻り値として出力できます.
    うその型を練習しないで、実例を示してみます.
    //       
    var calculate=function(a,b,metod){
      return method(a,b);
    };
    var add=function(a,b){return a+b;};
    console.info(calculate(1,2,add));//3
    
    //        
    var say=function(){
      return function(name){
        return name+' hello !';
      };
    };
    var sayHello=say();
    console.info(sayHello("Tom"));
    
    4.コリ化
    currying(関数コリック化)は、また不活性性実行(また、部分シークレットともいう)とも呼ばれる.一つのcurryingの関数は、まずいくつかのパラメータを受け取り、これらのパラメータを受け取った後、関数はすぐに実行されず、別の関数に戻り続け、先ほど入ってきたパラメータは関数によって形成されたクローズドに保存されます.関数が本当に実行される必要があるときは、前に伝えたすべてのパラメータが実行されます.
    var addX=function(a){
      return function(b){
        return a+b;
      };
    };
    var addOne=addX(1);
    console.info(addOne(1));//2
    console.info(addOne(2));//3
    
    コリック化は非常に強力な利器であり、その応用の原理は、方法スタック中のパラメータを利用して参照されると、参照されたパラメータを保持することである.したがって、この機能を利用して、前の入力を保留し、この入力を繰り返し使用することができる.後の実践の中で、私達はこの利器を何度も利用して、より強力な機能を実現します.
    5.反カリ化
    unCurrying(逆カリー化)は逆コリック化であり、一般化の過程である.これは逆コリック化された関数を使用して,より多くのパラメータを受信できる.目的は、元のオブジェクトに限定されず、他のオブジェクトによって使用できるより一般的な関数を作成することです.
    //    1
    function unCurrying(fn){
        return function(){
            var args = [].slice.call(arguments);
            var that = args.shift();
            return fn.apply(that, args);
        }
    }
    //    2
    Function.prototype.unCurrying = function(){
        var self = this;
        return function(){
            return Function.prototype.call.apply(self, arguments);
        }
    }