01.函數程序風格(FP Style)

Functional Programming Style

方法行為(Method)不俱副作用是函數風格程序的一個很重要的理念。Method 唯一的效果應該是計算並返回值。用這種方式工作的好處就是在方法之間很少糾纏在一起,因此程序也就更加可靠和可重用性。





函數編程(FP)


函數語言的名稱源於這樣一種概念:程序行為應該像數學函數一樣;換句話說,給定一組輸入,函數應始終返回相同的輸出。這不僅意味著每個函數必須返回一個 值,還意味著從一個調用到下一個調用,函數本質上不得具有內蘊狀態(intrinsic state)。這種無狀態的內蘊概念(在函數/對象領域中,預設情況下指的是永遠不變的物件),是函數語言被認為是 C07.共時同作(Concurrency) 領域偉大的 「救世主」 的主要原因。



狀態不可變性


函數式語言。這意味著其資料是不可變的,像 Java 的 String 一樣,並且沒有副作用帶來的風險。對資料的任意操作會產生一個該資料新的修改後的版本, 但原資料仍然不變。在談到健壯性的時候,不可變性是其需要高度注意的一個因素,因為沒有代碼可以無意間修改其它代碼依賴的資料,但從並發的觀點來看,不可 變性也是一個十分重要的特性。如果資料不可變,其被兩個並行執行路徑更改的風險就不存在,因為沒有辦法改變它且不需要保持同步,所以資料可以被拷貝到其它機器上。

不可變性 — Erlang強制了這一點,而且你幾乎無法繞過它。但是,與強制一個單一類型相比,你可以用Scala神奇強大的類型系統的剩餘部分去交換。我在進行Scala Actor編碼時使用不可變資料,而讓Scala的類型系統負責其它類型。

實際上對於不可變性問題並沒有多少工作需要處理。你只需要將你的相關類(消息)定義為不可變的,其它的就不用管了。


行為不俱副作用


方法不應該有副作用是函數風格編程的一個很重要的理念。方法唯一的效果應該是計算並返回值。用這種方式工作的好處就是方法之間很少糾纏在一起,因此就更加可靠和可重用。

物件不可變

另一個好處(靜態類型語言裡)是傳入傳出方法的所有東西都被類型檢查器檢查,因此邏輯錯誤會更有可能把自己表現為類型錯誤。把這個函數式編程的哲學應用到物件世界裡意味著使物件不可變。



函數式遞迴


函數式編程與遞歸從來都是形影不離的。實際上離開了尾遞歸你很難寫出有用的Erlang程序,那是因為Erlang沒有循環——它對一切都使用遞歸(這在我看來是一件好事 :))。
這顯然使得Erlang與Scala產生了很大差別。Scala提供了很多更傳統的迭代,但David Pollack並沒看出在這種環境下尾遞歸有什麼優勢:

尾遞歸——對基於事件的Actor來說根本不是什麼問題。
如此說來,這僅僅有關你的偏愛和風格罷了。




Comments