2012-02-29 57 views
5

我注意到,有一定的核心概念,很多的函數式編程狂熱分子堅持:爲什麼函數式編程很好?

  • 避開狀態

  • 避免可變數據

  • 副作用最小

  • 等等

我不只是想知道其他東西做了函數式編程,但爲什麼這些核心思想是好的?爲什麼避免狀態是好事,其餘的呢?

回答

11

簡單的回答是,如果你沒有多餘的狀態擔心,你的代碼是簡單的推理。簡單的代碼更容易維護。您無需擔心特定代碼片段(如函數)之外的事情來修改它。這對測試等事情有非常有用的影響。如果你的代碼不依賴於某個狀態,那麼爲該代碼創建自動化測試就容易多了,因爲你不需要擔心初始化某個狀態。

有stateless代碼可以更容易創建線程程序爲好,因爲你不必擔心執行修改的約2牙/在同一時間讀取數據的共享一塊。你的線程可以運行獨立的代碼,這可以節省大量的開發時間。

本質,避免國家創造更簡單的方案。從某種意義上說,「移動部分」的數量較少(即代碼行可以交互),所以這通常意味着代碼更加可靠並且包含更少的錯誤。基本上,代碼越簡單,越不會出錯。對我來說,這是編寫無狀態代碼的本質。

有很多其他原因創建無狀態的,「功能性」的代碼,但他們都歸結爲簡單的我。

+1

應該提到併發更容易正確嗎? – ebaxt 2012-02-29 06:41:10

+0

是的,補充說。謝謝。 :) – Oleksi 2012-02-29 06:44:15

+0

+1。 Wellks說,Oleksi。 – 2013-03-19 17:11:42

5

除了什麼@Oleksi說,還有一個重要的事情:引用透明和交易數據結構。當然,你不需要一個函數式編程語言來完成這個任務,但是這對他們來說更容易一些。

Purely functional data structures保證保持不變 - 如果一個函數返回一棵樹,它將始終是同一棵樹,並且所有進一步轉換都會創建它的新副本。以這種方式回溯到任何以前版本的數據結構要容易得多,這對於許多基本算法來說很重要。

5

非常普遍,函數式編程意味着:

  • 鼓勵使用(第一類)功能
  • 鼓勵使用(可變)狀態

爲什麼是突變的問題嗎?考慮一下:突變就是數據結構,goto就是控制流量。也就是說,它允許你以非結構化的方式任意「跳躍」到完全不同的東西。因此,它有時是有用的,但大部分時間對可讀性,可測試性和組合性都有害。

+1

+1用於比較可變狀態與goto! – Ingo 2012-02-29 09:56:42

2

一個典型的功能特徵是「無子類型」。雖然這聽起來有點奇怪,但它有兩個原因:(某種原因):

  • 子類型關係導致了一堆不太明顯的問題。如果你不會將自己限制爲單一或混合繼承,那麼最終會出現鑽石問題。更重要的是你必須處理方差(協方差,逆變,不變),這很快就會變成一場噩夢,特別是對於類型參數(又名泛型)。還有幾個原因,甚至在面嚮對象語言中,你會聽到像「更喜歡構圖而非繼承」這樣的陳述。另一方面,如果你只是忽略了子類型,你可以推理更多關於你的類型系統的細節,這可能導致(幾乎)完全類型推斷,通常使用Hindley Milner類型推斷的擴展來實現。

當然,有時你會錯過亞型,但象Haskell語言已經找到了一個很好的回答這個問題:類型類,允許定義一種常見的「接口」(或「設置常用的操作」 )爲幾個其他不相關的類型。與OO語言的區別在於類型類可以在「之後」定義,而不需要觸及原始類型定義。事實證明,你可以使用類型類來完成幾乎所有你可以通過子類型進行的類型,但以一種更靈活的方式(並且不需要阻止類型推斷)。這就是爲什麼其他語言開始使用類似的機制(例如Scala中的隱式轉換或C#和Java 8中的擴展方法)

相關問題