我注意到,有一定的核心概念,很多的函數式編程狂熱分子堅持:爲什麼函數式編程很好?
避開狀態
避免可變數據
副作用最小
等等
我不只是想知道其他東西做了函數式編程,但爲什麼這些核心思想是好的?爲什麼避免狀態是好事,其餘的呢?
我注意到,有一定的核心概念,很多的函數式編程狂熱分子堅持:爲什麼函數式編程很好?
避開狀態
避免可變數據
副作用最小
等等
我不只是想知道其他東西做了函數式編程,但爲什麼這些核心思想是好的?爲什麼避免狀態是好事,其餘的呢?
簡單的回答是,如果你沒有多餘的狀態擔心,你的代碼是簡單的推理。簡單的代碼更容易維護。您無需擔心特定代碼片段(如函數)之外的事情來修改它。這對測試等事情有非常有用的影響。如果你的代碼不依賴於某個狀態,那麼爲該代碼創建自動化測試就容易多了,因爲你不需要擔心初始化某個狀態。
有stateless代碼可以更容易創建線程程序爲好,因爲你不必擔心執行修改的約2牙/在同一時間讀取數據的共享一塊。你的線程可以運行獨立的代碼,這可以節省大量的開發時間。
本質,避免國家創造更簡單的方案。從某種意義上說,「移動部分」的數量較少(即代碼行可以交互),所以這通常意味着代碼更加可靠並且包含更少的錯誤。基本上,代碼越簡單,越不會出錯。對我來說,這是編寫無狀態代碼的本質。
有很多其他原因創建無狀態的,「功能性」的代碼,但他們都歸結爲簡單的我。
除了什麼@Oleksi說,還有一個重要的事情:引用透明和交易數據結構。當然,你不需要一個函數式編程語言來完成這個任務,但是這對他們來說更容易一些。
Purely functional data structures保證保持不變 - 如果一個函數返回一棵樹,它將始終是同一棵樹,並且所有進一步轉換都會創建它的新副本。以這種方式回溯到任何以前版本的數據結構要容易得多,這對於許多基本算法來說很重要。
非常普遍,函數式編程意味着:
爲什麼是突變的問題嗎?考慮一下:突變就是數據結構,goto就是控制流量。也就是說,它允許你以非結構化的方式任意「跳躍」到完全不同的東西。因此,它有時是有用的,但大部分時間對可讀性,可測試性和組合性都有害。
+1用於比較可變狀態與goto! – Ingo 2012-02-29 09:56:42
一個典型的功能特徵是「無子類型」。雖然這聽起來有點奇怪,但它有兩個原因:(某種原因):
當然,有時你會錯過亞型,但象Haskell語言已經找到了一個很好的回答這個問題:類型類,允許定義一種常見的「接口」(或「設置常用的操作」 )爲幾個其他不相關的類型。與OO語言的區別在於類型類可以在「之後」定義,而不需要觸及原始類型定義。事實證明,你可以使用類型類來完成幾乎所有你可以通過子類型進行的類型,但以一種更靈活的方式(並且不需要阻止類型推斷)。這就是爲什麼其他語言開始使用類似的機制(例如Scala中的隱式轉換或C#和Java 8中的擴展方法)
應該提到併發更容易正確嗎? – ebaxt 2012-02-29 06:41:10
是的,補充說。謝謝。 :) – Oleksi 2012-02-29 06:44:15
+1。 Wellks說,Oleksi。 – 2013-03-19 17:11:42