成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

wangzy2019 / 2335人閱讀

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

何為柯里化

概念:在計算機(jī)科學(xué)中,柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(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

解釋:我們定義了一個add函數(shù),這個函數(shù)接受一個參數(shù)并返回一個新的函數(shù)。調(diào)用add之后,返回的函數(shù)通過閉包可以訪問到add的第一個參數(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ù)的能力,通過傳遞一到兩個參數(shù)調(diào)用函數(shù),就能得到一個記住了這些參數(shù)的新函數(shù)。

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

柯里化的好處

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

如何實(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99043.html

相關(guān)文章

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

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

    shixinzhang 評論0 收藏0
  • JavaScript 函數(shù)編程技巧 - 柯里

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

    edgardeng 評論0 收藏0
  • JS函數(shù)編程 - 函數(shù)組合與柯里

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

    MingjunYang 評論0 收藏0
  • JavaScript之柯里

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

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

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

    voyagelab 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<