1. 程式人生 > >什麼是函數語言程式設計(副作用、純函式、引用透明)

什麼是函數語言程式設計(副作用、純函式、引用透明)

    副作用的概念:一個帶有副作用的函式不僅只是簡單的返回一個值,還幹了一些其他的事情,比如:

      • 修改一個變數
      • 直接修改資料結構
      • 設定一個物件的成員
      • 丟擲一個異常或以一個錯誤終止
      • 列印到終端或讀取使用者的輸入
      • 讀取或寫入一個檔案
      • 在螢幕上繪畫

    因此我們對於函式式程式的判定邊界就在於:函式的副作用

    於是——當函式沒有副作用,那麼我們就說這個函式符合函數語言程式設計(FP);再給出純函式這個概念用來定義一個函式沒有副作用,我們可以說純函式構成的程式風格就是函式式的!

    buyCoffee的例子(p3):函式只不過是需要返回一杯咖啡,可是卻對費用進行了持久化操作(產生副作用),我們可以在buyCoffee方法返回咖啡時也把費用作為值一併返回,將費用這條記錄交給其他程式來做持久化,以此來去除副作用  ====》通過把這些副作用推到程式的外層,來轉換任何帶有副作用的函式(純的核心和一層很薄的外圍來處理副作用)

    引用透明:對於程式p,如果它包含的表示式e滿足引用透明,所有e都可以替換為它的運算結果而不會改變程式p的含義(要求函式不論進行任何操作都可以用它的返回值來代替)。

    引用透明與純函式的關聯:假如存在一個函式f,若表示式f(x)對所有引用透明的表示式x也是引用透明,那麼這個f是一個純函式(也就是說,傳入引用透明的x表示式給f,函式f(x)的返回值可以代替這個函式在其他程式起的作用)

    純函式的好處:純函式是模組化的、可組合的,因為它從“對結果做什麼(返回值)”和“如果獲取輸入(通過引數傳遞獲得輸入)”中分離了計算本身的邏輯,就像一個黑盒子。