js函數式編程(三)-compose和pointFree


compose即函數嵌套組合

組合compose在第一篇已經初見端倪,可以感受一下。compose函數的實現用閉包的方法。不完善實現如下:

const compose = (f, g) => { return x => f(g(x)); };

compose使用實例

你可以用ramda的compose函數,而不是自己實現。

import {compose} from 'ramda' const f = (x: number) => 2 * x const g = (y: number) => y + 1 const w = compose(g, f); console.log(w(1)) // 3 console.log(w(2)) // 5 console.log(w(3)) // 7

compose的數學特性

有了compose,我們可以很方便的組合,可以使用結合律,即

compose(toUpperCase, compose(head, reverse));

或者

compose(compose(toUpperCase, head), reverse);

你可以想想初中數學,這是成立的。現在多個函數組合成一個大函數,我們的代碼開始變得巧妙起來了。

##compose天生pointFree

用compose組合的就是pointFree代碼,即你無需指定傳遞的形參,你可以看看w函數,就知道了。是不是更妙了?其實離上一個妙,我們什么也沒做。哈哈哈!

組合像一系列管道那樣把不同的函數聯系在一起 ----原文

##要注意的是

compose只將不同函數的輸出與輸入相連,上面代碼有一些致命問題,無法分支!或者分支成本巨大,舉個例子,如果reverse出錯,那么后續就會繼續執行,head將拿到錯誤的輸入,繼續輸出,toUpperCase就錯上加錯了,當然你可以在每個函數內做嚴謹的if/else判斷,可是成本巨大。目前compose就是一匹脫了韁的駿馬。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM