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));

或者code

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

你能夠想一想初中數學,這是成立的。如今多個函數組合成一個大函數,咱們的代碼開始變得巧妙起來了。 數學

compose天生pointFree

用compose組合的就是pointFree代碼,即你無需指定傳遞的形參,你能夠看看w函數,就知道了。是否是更妙了?其實離上一個妙,咱們什麼也沒作。哈哈哈! 組合像一系列管道那樣把不一樣的函數聯繫在一塊兒 ----原文 console

要注意的是

compose只將不一樣函數的輸出與輸入相連,上面代碼有一些致命問題,沒法分支!或者分支成本巨大,舉個例子,若是reverse出錯,那麼後續就會繼續執行,head將拿到錯誤的輸入,繼續輸出,toUpperCase就錯上加錯了,固然你能夠在每一個函數內作嚴謹的if/else判斷,但是成本巨大。目前compose就是一匹脫了繮的駿馬。 class

相關文章
相關標籤/搜索