摘要:函數組合是函數式編程中非常重要的思想,它的實現的思路也沒有特別復雜。前者從左向右組合函數,后者方向相反。下面就是一個最簡單的可以組合兩個函數的在實際應用中,只能組合兩個函數的組合函數顯然不能滿足要求,我們需要可以組合任意個函數的組合函數。
函數組合是函數式編程中非常重要的思想,它的實現的思路也沒有特別復雜。有兩種函數組合的方式,一種是pipe,另一種是compose。前者從左向右組合函數,后者方向相反。
下面就是一個最簡單的可以組合兩個函數的compose
let compose = (f, g) => (...args) => f(g(...args));
在實際應用中,只能組合兩個函數的組合函數顯然不能滿足要求,我們需要可以組合任意個函數的組合函數。下面提供兩種思路。
一種思路兩種方法一種是遞歸,一種是循環,其實都是一樣的。具體的思路就是,先寫一個組合可以兩個函數的compose2,用compose2先把傳進來的末尾的兩個函數組合了,返回一個函數func,然后再compose2把func和傳進來的下一個函數組合起來,以此類推。
循環的方法
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組合方向相反的函數組合函數 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());更簡單的思路
上面的思路還是有點麻煩,其實不用糾結在組合,直接把前一個函數的處理參數之后的返回值傳給下一個函數就可以了。
循環的方法
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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107842.html
摘要:把數據的流向想象成糖果工廠的一條傳送帶,每一次操作其實都是冷卻切割包裝糖果中的一步。在該章節中,我們將會用糖果工廠的類比來解釋什么是組合。糖果工廠靠這套流程運營的很成功,但是和所有的商業公司一樣,管理者們需要不停的尋找增長點。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌...
摘要:組合的概念是非常直觀的,并不是函數式編程獨有的,在我們生活中或者前端開發中處處可見。其實我們函數式編程里面的組合也是類似,函數組合就是一種將已被分解的簡單任務組織成復雜的整體過程。在函數式編程的世界中,有這樣一種很流行的編程風格。 JavaScript函數式編程,真香之認識函數式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經驗,而且了解 JavaScript 里面作用域,閉...
摘要:可當我們進行函數式編程時,這樣的方式會遇到困難,難點在于如何停止。而在函數式編程中,數據在管道中流動,上一個函數的返回值會傳給下一個函數,除非報錯,事先寫好的流程是停不下來的。 以下代碼會用到函數組合函數compose,只要知道compose是干什么的就足夠了,如果好奇具體的實現,可以看《JavaScript函數式編程之函數組合函數compose和pipe的實現》 在寫命令式的代碼時,...
摘要:函數式編程中有一個比較重要的概念就是函數組合組合多個函數,同時返回一個新的函數。深入理解認識函數式編程里面跟類似的方法,就是。主要作用也是組合多個函數,稱之為流,肯定得按照正常方法,從左往右調用函數,與調用方法相反。 函數式編程中有一個比較重要的概念就是函數組合(compose),組合多個函數,同時返回一個新的函數。調用時,組合函數按順序從右向左執行。右邊函數調用后,返回的結果,作為左...
摘要:在函數式編程中的錯誤處理,強壯代碼文章中所用的思路與本篇一樣,只不過在函數式編程中的錯誤處理,強壯代碼中可以認為是以和作為標識,而本篇單獨創造了標識。使用本篇的方法重寫函數式編程中的錯誤處理,強壯代碼中的代碼參考資料函數式編程指南我在 以下代碼會用到函數組合函數compose,只要知道compose是干什么的就足夠了,如果好奇具體的實現,可以看《JavaScript函數式編程之函數組合...
閱讀 920·2021-11-25 09:43
閱讀 1293·2021-11-17 09:33
閱讀 3010·2019-08-30 15:44
閱讀 3310·2019-08-29 17:16
閱讀 480·2019-08-28 18:20
閱讀 1636·2019-08-26 13:54
閱讀 553·2019-08-26 12:14
閱讀 2174·2019-08-26 12:14