組合compose在第一篇已經初見端倪,能夠感覺一下。compose函數的實現用閉包的方法。不完善實現以下: 數組
const compose = (f, g) => { return x => f(g(x)); };
你能夠用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(toUpperCase, compose(head, reverse));
或者code
compose(compose(toUpperCase, head), reverse);
你能夠想一想初中數學,這是成立的。如今多個函數組合成一個大函數,咱們的代碼開始變得巧妙起來了。 數學
用compose組合的就是pointFree代碼,即你無需指定傳遞的形參,你能夠看看w函數,就知道了。是否是更妙了?其實離上一個妙,咱們什麼也沒作。哈哈哈! 組合像一系列管道那樣把不一樣的函數聯繫在一塊兒 ----原文 console
compose只將不一樣函數的輸出與輸入相連,上面代碼有一些致命問題,沒法分支!或者分支成本巨大,舉個例子,若是reverse出錯,那麼後續就會繼續執行,head將拿到錯誤的輸入,繼續輸出,toUpperCase就錯上加錯了,固然你能夠在每一個函數內作嚴謹的if/else判斷,但是成本巨大。目前compose就是一匹脫了繮的駿馬。 class