函數式編程

本文首發於個人GitHub博客,其它博客同步更新。git


函數式編程

什麼是函數式編程

  • 程序的本質:根據輸入經過某種運算得到相應的輸出
  • 「函數」:數學中的函數即映射關係:y = sin(x),y和x的關係
  • 純函數:相同的輸入始終要獲得相同的輸出
  • 做用:函數式編程就是用來描述數據之間的映射

函數的特性

函數是一等公民

  • 1.函數能夠存儲在變量中
  • 2.函數做爲參數(高階函數)
  • 3.函數做爲返回值(高階函數)

高階函數

  • 能夠把函數做爲參數傳遞給另外一個函數github

    • 優勢:靈活、不須要考慮函數內部如何實現
  • 能夠把函數做爲另外一個函數的返回值

閉包

  • 定義:函數和周圍的狀態(詞法環境)的引用捆綁在一塊兒造成閉包
  • 能夠在另外一個做用域中調用一個函數的內部函數並訪問到該函數的做用域中的成員

函數式的基礎

純函數

  • 定義:相同的輸入永遠會獲得相同的輸出,且沒有反作用
  • 相似映射關係y = f(x)
  • 功能庫:lodash數據庫

    • 純函數必須有輸入和輸出
    • 函數式編程不會保留計算中間的結果,因此變量不可變(無狀態的)
    • 能夠把一個函數的執行結果交給另外一個函數處理

反作用

  • 外部因素對程序結果的影響
  • 來源:配置文件、數據庫、獲取用戶的輸入……

柯里化

  • 定義:調用一個函數只傳遞部分的參數,而且返回新的函數,新函數去接受剩餘的參數,而且返回相應的結果編程

    • 當一個函數有多個參數的時候,先傳遞一部分參數調用它(這部分參數之後永遠不變)
    • 而後返回一個新的函數接收剩餘的參數,返回結果
  • Lodash裏的柯里化數組

    • _.curry(func)
    • 功能:該函數接收一個或者多個func的參數,若是func所須要的參數都被提供則執行func並返回執行的結果,不然繼續返回該函數並等待接收剩餘的參數
    • 參數:須要柯里化的函數
    • 返回值:柯里化後的函數

管道

函數組合

  • 定義:若是一個函數要通過多個函數處理才能獲得最終值,這個時候能夠把中間過程的函數合併成一個函數
  • 通俗:函數就像是數據的管道,函數組合就是把這些管道鏈接起來,讓數據穿過多個管道造成最終結果
  • 函數組合默認是從右到左執行
  • loadsh中的組合函數閉包

    • _.flow()從左到右運行
    • _.flowRight()從右到左運行
  • 知足結合律:即,能夠把g和f結合,還能夠把f和g結合

函子

概念:是一個特殊的容器,經過一個普通的對象來實現,該對象具備map方法,map方法能夠運行一個函數對值進行處理(變形關係)

  • 經過函控制反作用,也能夠進行異常處理、異步操做等
  • 函數式編程的運算不直接操做值,而是由函子完成
  • 函子就是一個實現了map契約的對象
  • 函子就是一個盒子,盒子封裝了一個值
  • 處理盒子的值,須要給map方法傳遞一個處理值得函數(純函數)
  • 最終map方法會返回一個包含新值的盒子(函子)

Functor

MayBe

  • 函子處理空值問題異步

    • map內部進行三元判斷

Either

  • Either函子能夠用來作異常處理函數式編程

    • 使用try{...}catch{...}分別調用兩個函子對象,一個返回傳入函數,一個返回正常輸出結果

IO

  • _value做爲一個函數處理,把不純的操做交給調用者來處理

Task

  • folktale標準函數式編程庫函數

    • 處理異步任務

Monad

  • 解決函子嵌套問題IO(IO(x))spa

    • 利用join、flatMap返回_value
面向對象:把事物抽象成程序中的類和對象,經過封裝、繼承和多態演示事物聯繫(抽象事物)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息