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

資訊專欄INFORMATION COLUMN

柯里化的理解和實現(xiàn)

hsluoyz / 1281人閱讀

摘要:閱讀學習專題之函數(shù)柯里化函數(shù)式編程指南對柯里化的理解很多人對于柯里化的理解僅僅停留在復用參數(shù)上。使用柯里化的場景想要實現(xiàn)某個操作邏輯。換句話說,柯里化將輸入的函數(shù)和參數(shù)進行綁定,返回綁定后的函數(shù),返回的函數(shù)期待剩余的參數(shù)。

閱讀學習

JavaScript專題之函數(shù)柯里化
JS 函數(shù)式編程指南

對柯里化的理解

很多人對于柯里化的理解僅僅停留在“復用參數(shù)”上。但我認為函數(shù)式編程思想更重要作用的是:解除函數(shù)對執(zhí)行時參數(shù)的依賴,增強函數(shù)的泛化能力,讓函數(shù)僅僅包含“純粹的操作邏輯”,這些操作邏輯要用在什么樣的輸入上,使用函數(shù)時再決定。

使用柯里化的場景:

想要實現(xiàn)某個操作邏輯。(舉一個最簡單的例子,從對象中取出某個屬性的值)

確認這個操作的輸入。(在這個例子中,輸入是對象和屬性key)

將操作的輸入作為函數(shù)的參數(shù),解除函數(shù)實現(xiàn)對【參數(shù)的具體值】的依賴。(function getProp(obj, key)

在函數(shù)體中,對這些參數(shù)執(zhí)行一系列操作,實現(xiàn)邏輯。(function getProp(obj, key) { return obj[key]; }

得到的函數(shù)就僅僅封裝了“操作邏輯”,函數(shù)對于操作的輸入不做任何假設(shè),因此函數(shù)的泛化能力很強,可以處理任何合法的輸入。(在這個例子中,getProp可以從任何對象中獲取任何屬性)

“不做任何假設(shè)”的說法其實不太準確,比如說getProp就假設(shè)了obj參數(shù)必須是對象,但這種假設(shè)是“完成操作邏輯”的必要要求,“不做任何多余的假設(shè)”更準確一些。我在這里使用更絕對的語氣,是為了增強自己對這個觀點的印象。

當用戶使用這個函數(shù)封裝的操作邏輯時,調(diào)用這個函數(shù),并且需要在參數(shù)中提供操作的輸入。函數(shù)執(zhí)行完以后,返回操作的輸出。可以將函數(shù)看作一個黑盒子,給什么輸入就會返回對應的輸出,函數(shù)本身是“無狀態(tài)”的。(在這個例子中,getProp(obj1, "key1")getProp(obj2, "key2"),函數(shù)能適應任何合法的輸入,不管調(diào)用多少次,不管傳入什么參數(shù),函數(shù)的操作邏輯都不會改變)

通過柯里化,可以在真正執(zhí)行函數(shù)之前先確定某些參數(shù)。換句話說,柯里化將輸入的函數(shù)和參數(shù)進行“綁定”,返回綁定后的函數(shù),返回的函數(shù)期待剩余的參數(shù)。(比如說,我們經(jīng)常要從Array的原型中獲取方法,let getPropFromArrProto = curry(getProp, Array.prototype);通過這個新的函數(shù)就能直接從Array.prototype中獲取屬性)

實現(xiàn)
function curry(fn, ...priorArgs) {
  const length = fn.length;
  return function judge(...restArgs) {
    return priorArgs.length + restArgs.length >= length
      ? fn.call(this, ...priorArgs, ...restArgs)
      : function (...args) { return judge.call(this, ...restArgs, ...args); }
  }
}

// 測試代碼
var fn = curry(function (a, b, c, d) {
  console.log([a, b, c, d]);
  return [a, b, c, d];
}, "p");

fn("a", "b", "c") // [ "p", "a", "b", "c" ]
fn("a", "b")("c") // [ "p", "a", "b", "c" ]
fn("a")("b")("c") // [ "p", "a", "b", "c" ]
fn("a")("b", "c") // [ "p", "a", "b", "c" ]

其中,

priorArgs.length + restArgs.length >= length
      ? fn.call(this, ...priorArgs, ...restArgs)
      : function (...args) { return judge.call(this, ...restArgs, ...args); }

它的意思是,如果已經(jīng)接受的參數(shù)數(shù)量不少于fn(被柯里化的函數(shù))期待的參數(shù)數(shù)量,就調(diào)用fn并返回結(jié)果。
否則,返回一個新的函數(shù),這個函數(shù)期待剩余的參數(shù)。
調(diào)用這個新函數(shù)會再次進行參數(shù)數(shù)量的判斷,如果已經(jīng)接受的參數(shù)數(shù)量不少于fn(被柯里化的函數(shù))期待的參數(shù)數(shù)量,就調(diào)用fn并返回結(jié)果,否則返回一個新的函數(shù)……以此類推。

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

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

相關(guān)文章

  • 「前端面試題系列6」理解函數(shù)的柯里

    摘要:原題如下寫一個方法,當使用下面的語法調(diào)用時,能正常工作這道題要考察的,就是對函數(shù)柯里化的理解。當參數(shù)只有一個的時候,進行柯里化的處理。這其實就是函數(shù)柯里化的簡單應用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯過了前面的篇章,可以在這里找到: ES6 中箭頭函數(shù)的...

    liaorio 評論0 收藏0
  • 前端進擊的巨人(五):學會函數(shù)柯里化(curry)

    摘要:函數(shù)柯里化是把支持多個參數(shù)的函數(shù)變成接收單一參數(shù)的函數(shù),并返回一個函數(shù)能接收處理剩余參數(shù),而反柯里化就是把參數(shù)全部釋放出來。但在一些復雜的業(yè)務邏輯封裝中,函數(shù)柯里化能夠為我們提供更好的應對方案,讓我們的函數(shù)更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學家Has...

    chengtao1633 評論0 收藏0
  • 前端基礎(chǔ)進階(八):深入詳解函數(shù)的柯里

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

    kk_miles 評論0 收藏0
  • 從一道面試題認識函數(shù)柯里

    摘要:函數(shù)柯里化在函數(shù)式編程中,函數(shù)是一等公民。函數(shù)柯里化的主要作用和特點就是參數(shù)復用提前返回和延遲執(zhí)行。可能在實際應用場景中,很少使用函數(shù)柯里化的解決方案,但是了解認識函數(shù)柯里化對自身的提升還是有幫助的。 最近在整理面試資源的時候,發(fā)現(xiàn)一道有意思的題目,所以就記錄下來。 題目 如何實現(xiàn) multi(2)(3)(4)=24? 首先來分析下這道題,實現(xiàn)一個 multi 函數(shù)并依次傳入?yún)?shù)執(zhí)行,...

    13651657101 評論0 收藏0
  • JavaScript函數(shù)式編程,真香之組合(一)

    摘要:組合的概念是非常直觀的,并不是函數(shù)式編程獨有的,在我們生活中或者前端開發(fā)中處處可見。其實我們函數(shù)式編程里面的組合也是類似,函數(shù)組合就是一種將已被分解的簡單任務組織成復雜的整體過程。在函數(shù)式編程的世界中,有這樣一種很流行的編程風格。 JavaScript函數(shù)式編程,真香之認識函數(shù)式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經(jīng)驗,而且了解 JavaScript 里面作用域,閉...

    mengbo 評論0 收藏0

發(fā)表評論

0條評論

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