本文首發於個人GitHub博客,其它博客同步更新。git
函數式編程
什麼是函數式編程
- 程序的本質:根據輸入經過某種運算得到相應的輸出
- 「函數」:數學中的函數即映射關係:y = sin(x),y和x的關係
- 純函數:相同的輸入始終要獲得相同的輸出
- 做用:函數式編程就是用來描述數據之間的映射
函數的特性
函數是一等公民
- 1.函數能夠存儲在變量中
- 2.函數做爲參數(高階函數)
- 3.函數做爲返回值(高階函數)
高階函數
能夠把函數做爲參數傳遞給另外一個函數github
- 能夠把函數做爲另外一個函數的返回值
閉包
- 定義:函數和周圍的狀態(詞法環境)的引用捆綁在一塊兒造成閉包
- 能夠在另外一個做用域中調用一個函數的內部函數並訪問到該函數的做用域中的成員
函數式的基礎
純函數
- 定義:相同的輸入永遠會獲得相同的輸出,且沒有反作用
- 相似映射關係y = f(x)
功能庫:lodash數據庫
- 純函數必須有輸入和輸出
- 函數式編程不會保留計算中間的結果,因此變量不可變(無狀態的)
- 能夠把一個函數的執行結果交給另外一個函數處理
反作用
- 外部因素對程序結果的影響
- 來源:配置文件、數據庫、獲取用戶的輸入……
柯里化
管道
函數組合
- 定義:若是一個函數要通過多個函數處理才能獲得最終值,這個時候能夠把中間過程的函數合併成一個函數
- 通俗:函數就像是數據的管道,函數組合就是把這些管道鏈接起來,讓數據穿過多個管道造成最終結果
- 函數組合默認是從右到左執行
loadsh中的組合函數閉包
- _.flow()從左到右運行
- _.flowRight()從右到左運行
- 知足結合律:即,能夠把g和f結合,還能夠把f和g結合
函子
概念:是一個特殊的容器,經過一個普通的對象來實現,該對象具備map方法,map方法能夠運行一個函數對值進行處理(變形關係)
- 經過函控制反作用,也能夠進行異常處理、異步操做等
- 函數式編程的運算不直接操做值,而是由函子完成
- 函子就是一個實現了map契約的對象
- 函子就是一個盒子,盒子封裝了一個值
- 處理盒子的值,須要給map方法傳遞一個處理值得函數(純函數)
- 最終map方法會返回一個包含新值的盒子(函子)
Functor
MayBe
Either
Either函子能夠用來作異常處理函數式編程
- 使用try{...}catch{...}分別調用兩個函子對象,一個返回傳入函數,一個返回正常輸出結果
IO
- _value做爲一個函數處理,把不純的操做交給調用者來處理
Task
Monad
面向對象:把事物抽象成程序中的類和對象,經過封裝、繼承和多態演示事物聯繫(抽象事物)