亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

函數(shù)式編程-柯里化(currying)

wangzy2019 / 2398人閱讀

摘要:柯里化的好處通過簡(jiǎn)單地傳遞幾個(gè)參數(shù),就能動(dòng)態(tài)創(chuàng)建實(shí)用的新函數(shù)而且還能帶來(lái)一個(gè)額外好處,那就是保留了函數(shù)定義,盡管參數(shù)不止一個(gè)如何實(shí)現(xiàn)柯里化

何為柯里化

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

參數(shù)且返回結(jié)果是新函數(shù)的技術(shù)。

上栗子
var add = function(x) {
    return function(y) {
        return x + y;
    }
}

var increment = add(1);
var addTen = add(10);

increment(2);
// 3

addTen(2);
// 12

解釋:我們定義了一個(gè)add函數(shù),這個(gè)函數(shù)接受一個(gè)參數(shù)并返回一個(gè)新的函數(shù)。調(diào)用add之后,返回的函數(shù)通過閉包可以訪問到add的第一個(gè)參數(shù)。這樣可以使這類函數(shù)的定義和調(diào)用更加容易。

進(jìn)階(for our enjoyment)
var curry = require("lodash").curry;
var match = curry(function(what, str) {
    return str.match(what);
})

var replace = curry(function(what, replacement, str) {
    return str.replace(what, replacement);
})

var filter = curry(function(f, array){
    return array.filter(f);
})

match(/s+/g, "hello world");
// [" "]

match(/s+/g)("hello world");
//[" "]

var hasSpaces = match(/s+/g);
// function(x) { return x.match(/s+/g) }

hasSpaces("hello world");
//[" "]

hasSpaces("sssss");
// null

var noVowels = replace(/[aeiou]/ig);
// function(replacement, x) { return x.replace(/[aeiou]/ig, replacement) }

var censored = noVowels("*");
// function(x) { return x.replace(/[aeiou]/ig, "*") }

censored("Chocolate Rain");
// "Ch*c*l*t* R**n"

filter(hasSpaces, ["tori_spelling", "tori amos"]);
// ["tori amos"]

var findSpaces = filter(hasSpaces);
// function(xs) { return xs.filter(function(x) { return x.match(/s+/g) }) }

findSpaces(["tori_spelling", "tori amos"]);
// ["tori amos"]

這里表明的是一種“預(yù)加載”函數(shù)的能力,通過傳遞一到兩個(gè)參數(shù)調(diào)用函數(shù),就能得到一個(gè)記住了這些參數(shù)的新函數(shù)。

當(dāng)我們談?wù)摷兒瘮?shù)的時(shí)候,我們常說函數(shù)接受一個(gè)輸入返回一個(gè)輸出。currying函數(shù)所做的正是這樣:每傳遞一個(gè)參數(shù)調(diào)用函數(shù),就返回一個(gè)新函數(shù)處理剩余的參數(shù)。

柯里化的好處

通過簡(jiǎn)單地傳遞幾個(gè)參數(shù),就能動(dòng)態(tài)創(chuàng)建實(shí)用的新函數(shù);而且還能帶來(lái)一個(gè)額外好處,那就是保留了函數(shù)定義,盡管參數(shù)不止一個(gè)

如何實(shí)現(xiàn)柯里化
var add = function(){
    var sum = 0;
    for(var i = 0, l = arguments.length; i < l; i++){
        sum += arguments[i];
    }
    return sum;
}

var curry = (function(fn){
    var args = [];
    return function(){
        if(arguments.length == 0) {
            return fn.apply(this, args)
        } else {
            [].push.apply(args, arguments);
            return arguments.callee;
        }
    }
})

currySum = curry(add);

currySum(1, 2, 3);
currySum(1);
currySum(1);
currySum(1);
currySum(1);
currySum();
// 10

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/99043.html

相關(guān)文章

  • 高級(jí)函數(shù)技巧-函數(shù)柯里

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

    shixinzhang 評(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ù)編程 - 函數(shù)組合與柯里

    摘要:而在函數(shù)式編程中方法是獨(dú)立于數(shù)據(jù)的,我們可以把上面以函數(shù)式的方式在寫一遍你肯定會(huì)說,你是在逗我。對(duì)比兩個(gè)生成新函數(shù)的過程,沒有柯里化的相對(duì)而言就有一點(diǎn)啰嗦了。 我們都知道單一職責(zé)原則,其實(shí)面向?qū)ο蟮腟OLID中的S(SRP, Single responsibility principle)。在函數(shù)式當(dāng)中每一個(gè)函數(shù)就是一個(gè)單元,同樣應(yīng)該只做一件事。但是現(xiàn)實(shí)世界總是復(fù)雜的,當(dāng)把現(xiàn)實(shí)世界映射...

    MingjunYang 評(píng)論0 收藏0
  • JavaScript之柯里

    摘要:簡(jiǎn)介柯里化,又稱部分求值,是把接收多個(gè)參數(shù)的函數(shù)變成接受一個(gè)單一參數(shù)最初函數(shù)的第一個(gè)參數(shù)的函數(shù),并且返回接受剩余的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。按照作者的說法,所謂柯里化就是使函數(shù)理解并處理部分應(yīng)用。的思想極大地助于提升函數(shù)的復(fù)用性。 簡(jiǎn)介 柯里化(Currying),又稱部分求值(Partial Evaluation),是把接收多個(gè)參數(shù)的函數(shù)變成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)...

    since1986 評(píng)論0 收藏0
  • js 函數(shù)編程函數(shù)柯里

    摘要:函數(shù)柯里化是指參數(shù)逐漸求值的過程。所以對(duì)于有兩個(gè)變量的函數(shù),如果固定了,則得到有一個(gè)變量的函數(shù)通用實(shí)現(xiàn)先看一個(gè)簡(jiǎn)單的例子顯然不是一個(gè)柯里化的實(shí)現(xiàn)。從一個(gè)通用的函數(shù)可接受任意,柯里化成專用的函數(shù)。 函數(shù)柯里化是指參數(shù)逐漸求值的過程。 我覺得它是:降低通用性,提高專用性。 通常,柯里化是這樣的過程,如果你固定某些參數(shù),你將得到接受余下參數(shù)的一個(gè)函數(shù)。所以對(duì)于有兩個(gè)變量的函數(shù)y^x,如果固定...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<