国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript函數(shù)式編程之函數(shù)組合函數(shù)compose和pipe的實(shí)現(xiàn)

Cristalven / 2405人閱讀

摘要:函數(shù)組合是函數(shù)式編程中非常重要的思想,它的實(shí)現(xiàn)的思路也沒有特別復(fù)雜。前者從左向右組合函數(shù),后者方向相反。下面就是一個(gè)最簡單的可以組合兩個(gè)函數(shù)的在實(shí)際應(yīng)用中,只能組合兩個(gè)函數(shù)的組合函數(shù)顯然不能滿足要求,我們需要可以組合任意個(gè)函數(shù)的組合函數(shù)。

函數(shù)組合是函數(shù)式編程中非常重要的思想,它的實(shí)現(xiàn)的思路也沒有特別復(fù)雜。有兩種函數(shù)組合的方式,一種是pipe,另一種是compose。前者從左向右組合函數(shù),后者方向相反。
下面就是一個(gè)最簡單的可以組合兩個(gè)函數(shù)的compose

let compose = (f, g) => (...args) => f(g(...args));

在實(shí)際應(yīng)用中,只能組合兩個(gè)函數(shù)的組合函數(shù)顯然不能滿足要求,我們需要可以組合任意個(gè)函數(shù)的組合函數(shù)。下面提供兩種思路。

一種思路

兩種方法一種是遞歸,一種是循環(huán),其實(shí)都是一樣的。具體的思路就是,先寫一個(gè)組合可以兩個(gè)函數(shù)的compose2,用compose2先把傳進(jìn)來的末尾的兩個(gè)函數(shù)組合了,返回一個(gè)函數(shù)func,然后再compose2把func和傳進(jìn)來的下一個(gè)函數(shù)組合起來,以此類推。

循環(huán)的方法

let compose2 = (f, g) => (...args) => f(g(...args));
let compose = (...funcArgs) => (...args) => {
  let funced = funcArgs[funcArgs.length - 1];
  for (let i = funcArgs.length - 2; i >= 0; i--) {
    if (i === 0) {
      return compose2(funcArgs[i], funced)(...args);
    }
    funced = compose2(funcArgs[i], funced);
  }
}

// 與compose組合方向相反的函數(shù)組合函數(shù)
let pipe = (...funcArgs) => compose(...funcArgs.reverse());

遞歸的方法

let compose2 = (f, g) => (...args) => f(g(...args));
let compose = (...funcArgs) => (...args) => {
  let [...funcArgsCopy] = funcArgs;
  let callSelf = func => {
    if (funcArgsCopy.length === 0) return func;
    let funced = compose2(funcArgsCopy.pop(), func);
    return callSelf(funced);
  }
  return callSelf(funcArgsCopy.pop())(...args);
}

let pipe = (...funcArgs) => compose(...funcArgs.reverse());
更簡單的思路

上面的思路還是有點(diǎn)麻煩,其實(shí)不用糾結(jié)在組合,直接把前一個(gè)函數(shù)的處理參數(shù)之后的返回值傳給下一個(gè)函數(shù)就可以了。
循環(huán)的方法

let compose = (...funcArgs) => (...args) => {
  for (let i = funcArgs.length - 1; i >= 0; i--) {
    args = i === funcArgs.length - 1 ? funcArgs[i](...args) : funcArgs[i](args);
  }
  return args;
}

let pipe = (...funcArgs) => compose(...funcArgs.reverse());

遞歸的方法

let compose = (...funcArgs) => (...args) => {
  let [...funcArgsCopy] = funcArgs;
  let funced = (...func) => {
    if (funcArgsCopy.length === 0) return func[0];
    func = funcArgsCopy.pop()(...func);
    return funced(func);
  }
  return funced(...args);
}

let pipe = (...funcArgs) => compose(...funcArgs.reverse());

我在github https://github.com/zhuanyongx...

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107842.html

相關(guān)文章

  • 翻譯連載 | JavaScript輕量級(jí)函數(shù)編程-第4章:組合函數(shù) |《你不知道JS》姊妹篇

    摘要:把數(shù)據(jù)的流向想象成糖果工廠的一條傳送帶,每一次操作其實(shí)都是冷卻切割包裝糖果中的一步。在該章節(jié)中,我們將會(huì)用糖果工廠的類比來解釋什么是組合。糖果工廠靠這套流程運(yùn)營的很成功,但是和所有的商業(yè)公司一樣,管理者們需要不停的尋找增長點(diǎn)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌...

    JowayYoung 評(píng)論0 收藏0
  • JavaScript函數(shù)編程,真香組合(一)

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

    mengbo 評(píng)論0 收藏0
  • JavaScript函數(shù)編程錯(cuò)誤處理,強(qiáng)壯代碼

    摘要:可當(dāng)我們進(jìn)行函數(shù)式編程時(shí),這樣的方式會(huì)遇到困難,難點(diǎn)在于如何停止。而在函數(shù)式編程中,數(shù)據(jù)在管道中流動(dòng),上一個(gè)函數(shù)的返回值會(huì)傳給下一個(gè)函數(shù),除非報(bào)錯(cuò),事先寫好的流程是停不下來的。 以下代碼會(huì)用到函數(shù)組合函數(shù)compose,只要知道compose是干什么的就足夠了,如果好奇具體的實(shí)現(xiàn),可以看《JavaScript函數(shù)式編程之函數(shù)組合函數(shù)compose和pipe的實(shí)現(xiàn)》 在寫命令式的代碼時(shí),...

    Yi_Zhi_Yu 評(píng)論0 收藏0
  • 函數(shù)編程 - 組合compose

    摘要:函數(shù)式編程中有一個(gè)比較重要的概念就是函數(shù)組合組合多個(gè)函數(shù),同時(shí)返回一個(gè)新的函數(shù)。深入理解認(rèn)識(shí)函數(shù)式編程里面跟類似的方法,就是。主要作用也是組合多個(gè)函數(shù),稱之為流,肯定得按照正常方法,從左往右調(diào)用函數(shù),與調(diào)用方法相反。 函數(shù)式編程中有一個(gè)比較重要的概念就是函數(shù)組合(compose),組合多個(gè)函數(shù),同時(shí)返回一個(gè)新的函數(shù)。調(diào)用時(shí),組合函數(shù)按順序從右向左執(zhí)行。右邊函數(shù)調(diào)用后,返回的結(jié)果,作為左...

    zhangrxiang 評(píng)論0 收藏0
  • JavaScript函數(shù)編程管道分支,消除if/else一種方

    摘要:在函數(shù)式編程中的錯(cuò)誤處理,強(qiáng)壯代碼文章中所用的思路與本篇一樣,只不過在函數(shù)式編程中的錯(cuò)誤處理,強(qiáng)壯代碼中可以認(rèn)為是以和作為標(biāo)識(shí),而本篇單獨(dú)創(chuàng)造了標(biāo)識(shí)。使用本篇的方法重寫函數(shù)式編程中的錯(cuò)誤處理,強(qiáng)壯代碼中的代碼參考資料函數(shù)式編程指南我在 以下代碼會(huì)用到函數(shù)組合函數(shù)compose,只要知道compose是干什么的就足夠了,如果好奇具體的實(shí)現(xiàn),可以看《JavaScript函數(shù)式編程之函數(shù)組合...

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

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

0條評(píng)論

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