定義函式式程式設計其實就是編寫非故意***的程式。
課外知識——什麼是函式函式簡單的說就是從a(定義域)到b(值域)的乙個對映過程。當然具體的函式還有各種限制,具體見鏈結。
所以函式式程式設計也應該是乙個從入參到返回值的黑盒子。
概述並不是所有人在函式式程式設計的定義上達成了共識。一般來說,函式式程式設計是使用函式來程式設計的一種程式設計正規化。但是這個定義並不能解釋最重要的一點:函式式程式設計和其他程式設計正規化的區別,以及究竟是什麼讓它(可能)成為程式設計的最佳方式。
函式式程式設計中沒有賦值語句,因此變數一旦有了值就不會再改變。更通俗的講,函式式程式設計沒有***——除了結算結果,呼叫函式沒有別的作用。這樣消除了bug的乙個主要**,也使得執行順序變得無關緊要。因為沒有能夠改變表示式值的***,可以在任何時候對它求值。由於能夠在任何時候對表示式求職,所以可以用變數的值來自由替換表示式,反之亦然——即程式是「引用透明」的。函式式程式設計是什麼理解事物是什麼而不是什麼往往都很重要。
函式式程式設計有時候被認為是一系列可以補充或替代的其他程式設計正規化的技術,例如
1. 如果b==0,返回a2. 否則a自增,b自減3. 用新的a和b重新計算另一方面,函式式程式設計是由「是」什麼的元素組成,而不是「做」什麼。a和b的和並不是會「造」出乙個結果。例如2與3的和,並不是會造出5,它就是5——每當你遇到2+3,就可以用5把它替換。
那在命令式程式設計裡面可以這樣替換嗎?有時候可以,但是有時候不改變程式的結果就無法做到——即如果替換掉的表示式沒有***,就可以替換。在命令式程式設計裡面,明顯a和b在求和的過程中自身發生了變化,這就是一種***,這種情況是無法替換的。
所有,命令式和函式程式設計的最大乙個不同是,函式式程式設計沒有***。這意味著:
這裡的「沒有***」是指沒有可觀測到的***。函式式程式是由接受引數並返回值的函式復合而成的,僅此而已,你不關心函式內部發生了什麼。但是在實際上,程式是為完全不函式式的計算機而編寫的。所有的計算機都基於相同的命令正規化,所以函式就是如下黑盒:
這是一種理論上的,實際上函式不可能完全沒有***。函式會在某個時刻返回乙個值,而這個值可能是變化的,這就是乙個***。也可能會造成記憶體耗盡的錯誤,或者堆疊溢位的錯誤,導致應用程式奔潰,正在某種意義上就是乙個可觀測到的***。
所以函式式程式設計其實就是編寫非故意的***的程式——***是程式預期的一部分。非故意的***也應該越少越好。
編寫沒有***的程式前面提到了函式式程式設計是編寫沒有***的程式,那麼如何實現呢?函式式程式設計並非編寫沒有可觀測結果的程式。是關於編寫除了返回值以外沒有可觀測結果的程式。但是如果這個就是程式的全部,那用途不大。實際上函式程式設計需要可觀測的作用,例如把結果顯示在螢幕上。換句話說與外界的互動不會發生在計算過程中,而是發生在計算完成後——將會推遲***並單獨應用。
public static int add(int a,int b) return a;}這段**是完全函式式。完全沒有其他可觀測的作用。雖然可能結果不正確(在溢位的情況下),但是與沒有***並不矛盾。即使返回錯誤結果也是函式式的。
public static int div(int a,int b)這個**就不是函式式的,雖然沒有改變任何變數,但是b=0時會丟擲異常——這就是乙個***。但是下面的是函式式的。
public static int div(int a,int b)即使b=0,也不會丟擲異常。
無論拋異常是否有意為之還是無意的,終歸是乙個***。儘管在命令式程式設計裡面***一般也是我們想要的。最簡單的形式如下:
public static void add(int a,int b)system.out.println(a);}這個程式並不返回值,但是把結果列印到了控制台上,這就是期望的***。但是下面的**不是函式式的。因為返回了值又有意加上了***——編寫除了返回值沒有意外可觀測結果的程式。
public static int add(int a,int b) log(string.format("returning %s",a)); return a;}
函式式程式設計就是編寫非有意***的程式,如果需要***盡可能的延遲***發生的時機。如果既有返回值又有***,這種程式就不是函式式。引用透明如何讓程式更安全沒有***(並不會改變外界的什麼)並不足以讓程式程式設計函式式的,同樣函式式程式設計也不能被外界所影響——函式式程式的輸出只能取決於自己的引數,這就意味著函式式**不能從控制台、檔案等讀取資料,既函式式**是引用透明的(不被外界影響到的**是引用透明的)。
引用透明**的特點:
函式式程式設計的優勢
什麼是函式式程式設計
1 函式式程式設計 它屬於 結構化程式設計 的一種,主要思想是把運算過程盡量寫成一系列巢狀的函式呼叫。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當作輸入 引數 和輸出 返回值 補充 lambda演算是通過乙個函式來解決這個問題,而這個函式又是由一系...
什麼是函式式程式設計
通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 注意多了乙個 式 字 functional programming,雖然也可以歸結到面向過程的程式設計,但其思想更接近數學計算...
什麼是函式式程式設計思維?
我為什麼要把我的知乎回答搬到這裡呢 大概是太久沒發東西了來湊數吧。函式式程式設計與命令式程式設計最大的不同其實在於 函式式程式設計關心資料的對映,命令式程式設計關心解決問題的步驟 這裡的對映就是數學上 函式 的概念 一種東西和另一種東西之間的對應關係。這也是為什麼 函式式程式設計 叫做 函式式程式設...