成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

柯里化

Tony / 1062人閱讀

摘要:從定義中我們可以對(duì)柯里化的步驟做一個(gè)簡(jiǎn)要的概括存在一個(gè)函數(shù),接受一個(gè)函數(shù)作為參數(shù),并返回一個(gè)函數(shù)。若相等,則將參數(shù)放入源函數(shù)并返回執(zhí)行結(jié)果。

柯里化 高階函數(shù)

在說(shuō)明柯里化之前,首先需要理解高階函數(shù)的定義

高階函數(shù)是指以函數(shù)作為參數(shù)的函數(shù),偽代碼可以理解為

function higherOrderFunction(fn) {
    console.log(typeof fn) // "function"
    
}
定義

在計(jì)算機(jī)科學(xué)中,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。

從定義中我們可以對(duì)柯里化的步驟做一個(gè)簡(jiǎn)要的概括:

存在一個(gè)函數(shù)currying,接受一個(gè)函數(shù)source作為參數(shù),并返回一個(gè)函數(shù)tmpCurrying。

tmpCurrying接收單一參數(shù),并再次返回一個(gè)tmpCurrying,直到所有tmpCurrying接收的參數(shù)和等于source函數(shù)所需的形參數(shù)量。

將tmpCurrying收到的所有單一參數(shù)按順序放入source函數(shù),并執(zhí)行,以獲得結(jié)果。

實(shí)際應(yīng)用 使用形式

根據(jù)如上定義,可以用如下偽碼表示柯里化的使用

參數(shù)分步輸入

// 實(shí)現(xiàn)參數(shù)分步輸入
function sum(a,b,c) {
    return [...args].reduce((pre,next) => (pre + next));
}

// 存在一個(gè)函數(shù)currying

const curriedSum = currying(sum);

curriedSum(1)(2)(3); // 6;
curriedSum(1, 2)(3); // 6;
curriedSum(1, 2, 3); // 6;

函數(shù)抽象,高階函數(shù)封裝

// 用于函數(shù)抽象,高階函數(shù)封裝等
// 存在如下功能函數(shù)

function isPhone(number) {
    return /^1[34578]d{9}$/.test(number);
}

function isMail(mail) {
    return /^(w)+(.w+)*@(w)+((.w+)+)$/.test(mail);
}

/*
    可以講上面兩個(gè)函數(shù)抽象為
    regString.test(targetString);
*/
function check(reg, target) {
    return reg.test(target);
}


/*
    但是每次使用時(shí)仍然需要輸入正則作為參數(shù),于是考慮利用柯里化的功能,將函數(shù)參數(shù)拆為兩部分,正則 + 校驗(yàn)對(duì)象
    假設(shè)存在一個(gè)柯里化函數(shù)currying(fn, reg)
*/



export const checkPhone = currying(check, /^1[34578]d{9}$/);

export const checkMail = currying(check, /^(w)+(.w+)*@(w)+((.w+)+)$/);


/* 
    checkPhone和checkMail此時(shí)皆是只需要一個(gè)參數(shù)targetString的函數(shù)
    使用時(shí)只需直接使用即可
*/

checkPhone(13111111111); // true;
柯里化實(shí)現(xiàn)

想要實(shí)現(xiàn)柯里化函數(shù),需要掌握以下知識(shí)點(diǎn)

閉包:內(nèi)層函數(shù)可以訪問(wèn)外層函數(shù)的變量

Function.length: 函數(shù)的length屬性表示其聲明時(shí)的形參數(shù)量

arguments: 類數(shù)組arguments表示函數(shù)調(diào)用時(shí)的實(shí)參列表(或直接使用參數(shù)解構(gòu),獲取實(shí)參數(shù)組,推薦此種。原因:arguments只是類數(shù)組,沒(méi)有數(shù)組方法,不方便使用,需要用結(jié)構(gòu)或apply等方式將其轉(zhuǎn)化為數(shù)組)

實(shí)現(xiàn)解析

利用閉包將每次多帶帶輸入的參數(shù)存入外層函數(shù)currying的數(shù)組變量args中。

校驗(yàn)當(dāng)前args的長(zhǎng)度與被封裝函數(shù)的形參數(shù)量是否相等,不相等則繼續(xù)返回接受參數(shù)的中間函數(shù)。

若相等,則將參數(shù)放入源函數(shù)并返回執(zhí)行結(jié)果。

實(shí)現(xiàn)1---每次只接受一個(gè)參數(shù)
function currying(src) {
    // 記錄源函數(shù)的形參長(zhǎng)度
    const length = src.length;
    // 參數(shù)列表
    const argsPool = [];
    
    return function tmpFn (arg) {
        // 將參數(shù)推入?yún)?shù)池
        argsPool.push(arg);
        
        // 長(zhǎng)度判斷
        if (length > argsPool.length) {
            return tmpFn;
        } else {
            const res = src(...argsPool);
            argsPool = [];
            return res;
        }
    }
}


function sum(a, b, c, d, e, f) {
    return [...arguments].reduce((pre, next) => (pre + next));
}


const _sum = currying(sum);
_sum(1)(2)(3)(4)(5)(6); // 21
實(shí)現(xiàn)2:每次接受若干個(gè)參數(shù)
function currying(src, ...args) {
    // 記錄源函數(shù)的形參長(zhǎng)度
    const length = src.length;
    // 參數(shù)列表
    const argsPool = [...args];
    
    return function tmpFn (...args) {
        // 將參數(shù)推入?yún)?shù)池
        argsPool.push(...args);
        
        // 長(zhǎng)度判斷
        if (length > argsPool.length) {
            return tmpFn;
        } else {
            const res = src(...argsPool);
            argsPool = [];
            return res;
        }
    }
}


function sum(a, b, c, d, e, f) {
    return [...arguments].reduce((pre, next) => (pre + next));
}


const _sum = currying(sum);
_sum(1)(2)(3)(4)(5)(6); // 21
_sum(1, 2, 3, 4)(5, 6); // 21
實(shí)現(xiàn)3:不規(guī)定參數(shù)個(gè)數(shù),以無(wú)參數(shù)傳入為循環(huán)終止標(biāo)識(shí)
function currying(src, ...args) {
    // 參數(shù)列表
    let argsPool = [...args];
    
    
    return function tmpFn (...args) {
        if (args.length > 0) {
            argsPool.push(...args);
            return tmpFn;
        } else {
            const res = src(...argsPool);
            argsPool = [];
            return res;
        }
    }
}


function sum(...args) {
    return args.reduce((pre, next) => (pre + next));
}


const _sum = currying(sum);

_sum(1,2,3)(4,5)(); // 15
_sum(1,2)();        // 3

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102321.html

相關(guān)文章

  • 高階函數(shù)應(yīng)用 —— 柯里與反柯里

    摘要:柯里化通用式上面的柯里化函數(shù)沒(méi)涉及到高階函數(shù),也不具備通用性,無(wú)法轉(zhuǎn)換形參個(gè)數(shù)任意或未知的函數(shù),我們接下來(lái)封裝一個(gè)通用的柯里化轉(zhuǎn)換函數(shù),可以將任意函數(shù)轉(zhuǎn)換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數(shù)的一種應(yīng)用,在這之前...

    wyk1184 評(píng)論0 收藏0
  • 前端進(jìn)擊的巨人(五):學(xué)會(huì)函數(shù)柯里(curry)

    摘要:函數(shù)柯里化是把支持多個(gè)參數(shù)的函數(shù)變成接收單一參數(shù)的函數(shù),并返回一個(gè)函數(shù)能接收處理剩余參數(shù),而反柯里化就是把參數(shù)全部釋放出來(lái)。但在一些復(fù)雜的業(yè)務(wù)邏輯封裝中,函數(shù)柯里化能夠?yàn)槲覀兲峁└玫膽?yīng)對(duì)方案,讓我們的函數(shù)更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學(xué)家Has...

    chengtao1633 評(píng)論0 收藏0
  • JavaScript 函數(shù)式編程技巧 - 柯里

    摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。在一些函數(shù)式編程語(yǔ)言中,會(huì)定義一個(gè)特殊的占位變量。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying)...

    edgardeng 評(píng)論0 收藏0
  • JS中的柯里

    摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。 作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying),又稱部分求值(Partial Evalu...

    Hancock_Xu 評(píng)論0 收藏0
  • 高級(jí)函數(shù)技巧-函數(shù)柯里

    摘要:如果你對(duì)函數(shù)式編程有一定了解,函數(shù)柯里化是不可或缺的,利用函數(shù)柯里化,可以在開(kāi)發(fā)中非常優(yōu)雅的處理復(fù)雜邏輯。同樣先看簡(jiǎn)單版本的方法,以方法為例,代碼來(lái)自高級(jí)程序設(shè)計(jì)加強(qiáng)版實(shí)現(xiàn)上面函數(shù),可以換成任何其他函數(shù),經(jīng)過(guò)函數(shù)處理,都可以轉(zhuǎn)成柯里化函數(shù)。 我們經(jīng)常說(shuō)在Javascript語(yǔ)言中,函數(shù)是一等公民,它們本質(zhì)上是十分簡(jiǎn)單和過(guò)程化的??梢岳煤瘮?shù),進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)處理,return 結(jié)果,...

    shixinzhang 評(píng)論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(八):深入詳解函數(shù)的柯里

    摘要:函數(shù)被轉(zhuǎn)化之后得到柯里化函數(shù),能夠處理的所有剩余參數(shù)。因此柯里化也被稱為部分求值。那么函數(shù)的柯里化函數(shù)則可以如下因此下面的運(yùn)算方式是等價(jià)的。而這里對(duì)于函數(shù)參數(shù)的自由處理,正是柯里化的核心所在。額外知識(shí)補(bǔ)充無(wú)限參數(shù)的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函數(shù)的一個(gè)比較高級(jí)的應(yīng)用,想要...

    kk_miles 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<