js函數式編程(一)-純函數

我將寫的第一個主題是js的函數式編程,這一系列都是mostly adequate guide這本書的讀書總結。原書在gitbook上,有中文版。因爲原做者性格活潑,書中夾雜不少俚語,而且行文灑脫。中文譯版不免有時須要思量一番,既然讀了就寫出來,能方便別人最好,也請讀者指正。正文以下。

若是一個函數是純函數,那麼其不依賴外部環境,而且不產生反作用。

  • 1.不依賴外部環境,反例以下:
const a1 = 10;
const aFunc1 = () => {
  // 依賴外部變量
  return a1;
}

依賴外部環境的函數在運行時必須知足環境條件,如上,aFunc1在a1建立以前運行,就出錯了。javascript

  • 2.不產生反作用。所謂反作用,是一切與外部交互的做用,好比console.log,IO,網絡請求等。這些操做的結果是不可預計的,因此當包含反作用操做的函數執行後,結果是不可預計的。好比IO讀寫失敗,網絡出現問題,console.log一般沒什麼問題,但這仍然是外部的。舉個片面的例子,在react裏使用,就有可能由於打印某個在將來會被改變的狀態,致使組件沒必要要的被刷新。java

  • 3.函數與外部的合法交互只能經過參數傳遞的方式。react

那麼爲何要用純函數,純函數和函數式編程有什麼關係?

函數式編程,本質上是數學,它是數學現有理論在編程上的實現,在數學上,一個定理成立一般要知足一些數學條件,函數式編程也須要知足條件,這個條件就是函數必須是純函數。 git

那麼這是什麼數學理論呢?

圖片名稱

如上圖,能夠用一個函數表達式描述,即y = f(x),這是一種一一對應關係,輸入x能獲得惟一的結果y。也就是說x通過f的轉換變成y,這個過程是穩定的,肯定的,以此類推,y也能夠通過某種肯定的轉換g,變成z,那麼就具備以下等式: 編程

\[y = f(x) = 2x\]網絡

\[z = g(y) = y + 1\]ide

\[z = g(f(x)) = w(x) = 2x + 1\]函數式編程

也就是說x通過w轉換,能夠變成z 函數

圖片名稱2

某個狀態通過多個函數轉換成另外一個狀態,那麼中間轉換過程能夠結合成一個轉換,這大大的使問題簡化,這是函數式編程帶來的好處,並且只是一部分的好處,而這都基於純函數。 ui

如何看待反作用?

固然,咱們知道,**不少時候沒法避免使用反作用**。就如發送消息,必須通過網絡。那是否函數式編程沒有實際運用價值呢?固然不是。全部事情都不該該極端的理解,函數式編程的種種定理必須以純函數做爲根基,目的是寫出健壯的,聲明式的代碼。能夠利用函數式編程中如curry,functor,monad等奇巧淫記,將反作用加以限制並降到最低限度,保證代碼的大部分是純的。

相關文章
相關標籤/搜索