直接的に理解するjavascriptの中で関数の柯里化、偏関数、逆関数の柯里化


直接的に理解するjavascriptの中で関数の柯里化、偏関数、逆関数の柯里化
前に関数式プログラミングを理解するために書いたことがありますが、関数式プログラミングについては関数コリック化、関数コリック化は関数式プログラミングによくある書き方です.これもたくさんのオーディエンスの文章を読んで総合的に理解しました.以下は個人の簡潔で、これらの定義をより分かりやすく理解してほしいです.
関数コリック化
定義
公式の定義:複数のパラメータを受け入れる関数を単一のパラメータ(最初の関数の最初のパラメータ)を受け入れる関数に変換し、残りのパラメータを受け入れて結果を返す新しい関数を返す技術です.
簡単にいうと、一度に複数のパラメータに入った関数を、一つのパラメータが入ってくるたびに別の関数に戻ります.例:
add(1,2,3)
add(1)(2)(3)()
これは関数のカリー化という意味です.次にどのように実現するかを話してからカリー化の意味を書きます.
コリック化を実現する
まずaddを例にして、addを例にして、多くの文書の中にも基本は同じです.ここはes 6文法で書きます.簡単で分かりやすいですから.
//    
const add = (...values)=> {
    return values.reduce((a,b)=> a+b)
}

//     
const curringAdd = (...values)=> {
     let _args = [...values]  //             
    const innerAdd =  (...rest)=> {
        _args = [..._args,...rest]//          ,           
        if(rest.length === 0) {  //              ,           
             return _args.reduce((a,b)=> a+b)
        }else {
            return innerAdd
        }
    };
    return innerAdd //         
}
//          
add(1)(2)(3)() //6
//   
add(1,2)(3)(4,5)() //15
ここで関数のカリー化を実現しましたが、聡明な私達は間違いなく***を見抜きます.実は上で書き換えたカリー化の本質は、常にすべてのパラメータを一つの配列に置いて、クローズド形式でキャッシュし、最後の呼び出しで結果を実行します.
このロジックが同じなら、もちろん普通の関数をコリメート関数に変換するための一般的な方法を書いてもいいです.具体的なコードは次の通りです.
   let toCurring = (fn)=>{
        var _args = [];
       	const innerCurring = (...values)=>{
            if(values.length === 0) {/              ,           
                return fn.apply(this, _args);
            }
            _args = [..._args,...values] //          ,           
            return innerCurring;
        }
    }
基本的なロジックは前に書いたカリー化のaddと同じです.これで簡単に普通の関数のカリー化ができます.
//    
const add = (...values)=> {
    return values.reduce((a,b)=> a+b)
}
//        
const curringAdd = toCurring(add)
次は重要です.カリー化には何の意味がありますか?
柯里化の意義と役割
1.パラメータ多重(パラメータ多重は個人的には偏り関数の意味と考えられ、後には偏り関数として一般的には柯里化の書き方ですが);
2.前に戻る(前に戻ってよく理解すると、いくつかのパラメータが入ってきて直接計算することができる)
3.遅延計算/運転(遅延計算でも理解できるということは、パラメータが入るたびに直接計算されないと最後に計算されます)
ここでは、個人の柯里化の役割について説明します.
例えば、社員が出勤する時、出張を派遣します.毎回領収書を清算します.
普通の関数の方法はすべての領収書を自分の手に集めて、時間ごとに一回清算します.毎回、領収書を山のように持って財務のところに行って清算します.
柯里化関数の方法は毎回領収書を言って財務に渡すのでさえすれば、使いたい時直接と財務は1回言って取り出して、あなたは自分で領収書を蓄える必要がなくて、流れはつまり:n*は領収書を交際します.
ここからカリー化された関数の流れが単一であることが分かります.関数の外で論理と関係のないデータを格納するコードを書く必要がありません.あなたは毎回会計に領収書を提出すればいいと知っています.一番重要なのはコードをより論理的に明確にして、コードをどのように呼び出すかを考えなくてもいいです.
偏関数
定義
偏向関数とは、毎回入ってくる同じパラメータを多重化することで、元の関数を一つのパッケージにすることになります.他の人のパッケージの良いコンポーネントを呼び出した時に、多くの属性が導入されるようになりますが、一部の属性は私達のプロジェクトの時に同じです.この時、自分でコンポーネントをもう一回カプセル化して、いくつかの属性を黙認して入ってきます.
上の汎用的なコリメート関数にならって、共通の偏関数を書くことができます.
const toPartial = (fn, ...argsFixed) {
    return function(...args) { // 
        return fn.call(this, ...argsFixed, ...args); //         
        }
    }
//      add      2
const curringAdd = toCurring(add)
const partialAdd = toPartial(curringAdd,2)
partialAdd(1)() //3
偏り関数は私達の日常の中でとても常用して、私達は通常関数と部品の包装に対して実は使った偏り関数の書き方です.
アンチカリ化
反コリー化は名前の通り、毎回一つのパラメータが入ってくると一つの関数の形に戻ります.一度に全部のパラメータが入ってきて、結果を返します.
簡単な実装:
const unCurring = (curringFn)=> {
    return (...args)=> {
        let lastFn = args.reduce(i=> curringFn(i))
        return lastFn()
    }
}

// curringAdd      
const add = unCurring(curringAdd)
add(1,2,3) //6
締め括りをつける
柯里化関数とは、一度に複数のパラメータに入る関数を、一つのパラメータに変換して別の関数を返します.
偏関数とは、元の関数をカプセル化し、デフォルトでは固定パラメータ多重パラメータに移行します.
逆カリー化関数はカリー化の逆操作です.
柯里化関数は関数式プログラミングの概念であり、必要な仕様ではなく、コードの中でよく使われる書き方であり、作用は論理をより明確にし、コードに業務フローをもっと重視させます.