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

資訊專(zhuān)欄INFORMATION COLUMN

函數(shù)柯里化(curry)

import. / 1874人閱讀

摘要:還是上面函數(shù)的例子,我們希望實(shí)現(xiàn)下面的形式在下一節(jié)具體實(shí)現(xiàn)部分應(yīng)用只傳遞了第一個(gè)參數(shù)分析上面的代碼可知,實(shí)現(xiàn)部分應(yīng)用的關(guān)鍵是部分應(yīng)用的返回結(jié)果是一個(gè)新的函數(shù)該函數(shù)可以被傳入其他參數(shù)再次調(diào)用柯里化現(xiàn)在進(jìn)入正題,前面講完了部分應(yīng)用。

前言

(話(huà)不多說(shuō),填之前的坑)

正文 引子-從apply說(shuō)函數(shù)應(yīng)用

在js里,我們對(duì)于function的用法,可能大部分情況下都還是處于調(diào)用,形如

function add(x, y) {
    return x + y
}
console.log(add(1, 2)) //函數(shù)調(diào)用 返回3

但是有一個(gè)apply()函數(shù),使我們擁有另一種方式來(lái)應(yīng)用函數(shù),例如

function add(x, y) {
    return x + y
}
console.log(add.apply(null, [1, 2])) //返回3

apply的第一個(gè)參數(shù)為null時(shí),this指向全局對(duì)象(忘記請(qǐng)自行查閱查mdn),在上面這個(gè)例子里,通過(guò)apply來(lái)應(yīng)用函數(shù)的時(shí)候,效果和調(diào)用函數(shù)完全一致。

部分應(yīng)用

從前文可知,函數(shù)調(diào)用就是讓一個(gè)參數(shù)集合(前面的[1,2])應(yīng)用到函數(shù)(前文的add函數(shù))中,那部分應(yīng)用就是考慮只傳遞部分參數(shù),而非所有參數(shù)。 還是上面add函數(shù)的例子,我們希望實(shí)現(xiàn)下面的形式(在下一節(jié)具體實(shí)現(xiàn)):

var newAdd = add.apply(null,[1])//部分應(yīng)用 只傳遞了第一個(gè)參數(shù)
newAdd.apply(null,[2]) //3

分析上面的代碼可知,實(shí)現(xiàn)部分應(yīng)用的關(guān)鍵是:部分應(yīng)用的返回結(jié)果是一個(gè)新的函數(shù),該函數(shù)可以被傳入其他參數(shù)再次調(diào)用

柯里化(curry)

現(xiàn)在進(jìn)入正題,前面講完了部分應(yīng)用。curry化的含義,就是使函數(shù)理解并處理部分應(yīng)用的過(guò)程

繼續(xù)按照上文的思路實(shí)現(xiàn)add函數(shù)的curry化:

function add(x, y) {
    // 如果只傳遞部分參數(shù),則部分應(yīng)用,返回一個(gè)新的函數(shù)
    if (y === undefined) {
      return function (y) {
        return x + y
      }
    }
    return x + y //如果傳遞所有參數(shù),直接完全應(yīng)用
}
//運(yùn)行前一節(jié)代碼
var newAdd = add.apply(null, [1])
console.log(newAdd.apply(null, [2])) //3
console.log(newAdd.apply(null, [5])) //6

上述代碼已經(jīng)實(shí)現(xiàn)了前一節(jié)的要求,可以看到curry的結(jié)果就是:經(jīng)過(guò)一次curry的newadd函數(shù),變成一個(gè)與1求和的函數(shù),接應(yīng)用的時(shí)候只傳遞一個(gè)參數(shù),都能得到對(duì)應(yīng)的結(jié)果,同時(shí)也可以看出這個(gè)curry太局限。接下來(lái)我們就要考慮,如何實(shí)現(xiàn)通用的curry函數(shù)

通用curry函數(shù)

先回憶前面的過(guò)程,來(lái)思考curry一個(gè)函數(shù)的實(shí)現(xiàn)步驟:

保存調(diào)用curry函數(shù)時(shí)傳入的參數(shù),返回一個(gè)新函數(shù)(即柯里化執(zhí)行結(jié)果)

結(jié)果函數(shù)在被調(diào)用后,要讓新的參數(shù)和舊的參數(shù)一起應(yīng)用的入?yún)⒑瘮?shù)中

注:入?yún)⒑瘮?shù)-要被curry的函數(shù),結(jié)果函數(shù)-被curry之后的函數(shù)*

文字比較抽象,可以直接看實(shí)現(xiàn)在回來(lái)看過(guò)程:

  function commonCurry(fn) {
    var slice = Array.prototype.slice,
      storedArgs = slice.call(arguments, 1) //使用slice是為了把a(bǔ)rguments轉(zhuǎn)換成真正的數(shù)組,剝離此處第一個(gè)參數(shù),是因?yàn)榈谝粋€(gè)參數(shù)是fn
    return function () {
      var newArgs = slice.call(arguments), //新傳入的參數(shù)
        args = storedArgs.concat(newArgs)
      return fn.apply(null, args)
    }
  }

  //使用舉例
  function add(a, b) {
    return a + b
  }
  var newAdd = commonCurry(add, 10)
  console.log(newAdd(5))
  
  // 多個(gè)參數(shù)
  function add2(a, b, c, d) {
    return a + b + c + d
  }
  var newAdd2 = commonCurry(add2, 10, 10)
  console.log(newAdd2(5, 4))//29
  
  // 多次curry
  var newAdd3 = commonCurry(newAdd2, 10)
  console.log(newAdd3(10))//40
小結(jié)

之后會(huì)嘗試以更簡(jiǎn)潔明了的方式來(lái)寫(xiě)文章。如果內(nèi)容有錯(cuò)誤的地方歡迎指出(覺(jué)得看著不理解不舒服想吐槽也完全沒(méi)問(wèn)題);如果對(duì)你有幫助,歡迎點(diǎn)贊和收藏,轉(zhuǎn)載請(qǐng)征得同意后著明出處,如果有問(wèn)題也歡迎私信交流,主頁(yè)添加了郵箱地址。

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

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

相關(guān)文章

  • 高級(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
  • 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 擴(kuò)展 -- currying 柯里函數(shù)

    摘要:里也有柯里化的實(shí)現(xiàn),只是平時(shí)沒(méi)有在意。如果函數(shù)柯里化后雖然生搬硬套,不過(guò)現(xiàn)實(shí)業(yè)務(wù)也會(huì)有類(lèi)似場(chǎng)景。 柯里化 先解釋下什么是 柯里化 在計(jì)算機(jī)科學(xué)中,柯里化(英語(yǔ):Currying),又譯為卡瑞化或加里化,是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。 js 里也有柯里化的實(shí)現(xiàn),只是平時(shí)沒(méi)有在意。先把原文簡(jiǎn)介貼...

    Pocher 評(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),又稱(chēng)部分求值(Partial Evalu...

    Hancock_Xu 評(píng)論0 收藏0
  • JS中的柯里 及 精巧的自動(dòng)柯里實(shí)現(xiàn)

    摘要:笑中自動(dòng)柯里化的精巧實(shí)現(xiàn)柯里化是函數(shù)式編程中很重要的一環(huán),很多函數(shù)式語(yǔ)言都會(huì)默認(rèn)將函數(shù)自動(dòng)柯里化。 什么是柯里化? 在計(jì)算機(jī)科學(xué)中,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。這個(gè)技術(shù)由 Christopher Strachey 以邏輯學(xué)家 Haskell Curry 命名的,盡管...

    moven_j 評(píng)論0 收藏0
  • JavaScript專(zhuān)題之函數(shù)柯里

    摘要:一個(gè)經(jīng)常會(huì)看到的函數(shù)的實(shí)現(xiàn)為第一版我們可以這樣使用或者或者已經(jīng)有柯里化的感覺(jué)了,但是還沒(méi)有達(dá)到要求,不過(guò)我們可以把這個(gè)函數(shù)用作輔助函數(shù),幫助我們寫(xiě)真正的函數(shù)。 JavaScript 專(zhuān)題系列第十三篇,講解函數(shù)柯里化以及如何實(shí)現(xiàn)一個(gè) curry 函數(shù) 定義 維基百科中對(duì)柯里化 (Currying) 的定義為: In mathematics and computer science, cu...

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

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

0條評(píng)論

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