❶ 函數式編程的特性
在經常被引用的論文 「Why Functional Programming Matters」(請參閱 參考資料) 中,作者 John Hughes 說明了模塊化是成功編程的關鍵,而函數編程可以極大地改進模塊化。在函數編程中,編程人員有一個天然框架用來開發更小的、更簡單的和更一般化的模塊, 然後將它們組合在一起。函數編程的一些基本特點包括:
支持閉包和高階函數,支持惰性計算(lazy evaluation)。使用遞歸作為控制流程的機制。加強了引用透明性。沒有副作用。我將重點放在在 Java 語言中使用閉包和高階函數上,但是首先對上面列出的所有特點做一個概述。 副作用是修改系統狀態的語言結構。因為 FP 語言不包含任何賦值語句,變數值一旦被指派就永遠不會改變。而且,調用函數只會計算出結果 ── 不會出現其他效果。因此,FP 語言沒有副作用 。
❷ 函數式編程的特點
函數式編程具有五個鮮明的特點。
1、函數是"第一等公民"
所謂"第一等公民"(first class),指的是函數與其他數據類型一樣,處於平等地位,可以賦值給其他變數,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。
2、只用"表達式",不用"語句"
"表達式"(expression)是一個單純的運算過程,總是有返回值;"語句"(statement)是執行某種操作,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。
3、沒有"副作用"
所謂"副作用"(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變數的值),產生運算以外的其他結果。
4、不修改狀態
上一點已經提到,函數式編程只是返回新的值,不修改系統變數。因此,不修改變數,也是它的一個重要特點。
5、引用透明性
函數程序通常還加強引用透明性,即如果提供同樣的輸入,那麼函數總是返回同樣的結果。就是說,表達式的值不依賴於可以改變值的全局狀態。
❸ 為什麼要用函數式編程
以 C 語言源程序為例,使用函數式的編程風格主要是有利於程序的調試!而且程序的可讀性也很好。程序思路很清楚!!以下面的源程序進行講解就一目瞭然了。在以下題目中,三次用到了求階乘的代碼(A!、(A-B)!、B!),現在使用調用子函數的編程風格,程序簡潔明了、且可讀性很強。如果不使用函數式編程,那麼求階乘的代碼你就必須要重復三次。你說到底是哪一種編程風格好呢?
例如:求組合數C(A,B) = A!/( (A-B)! * B! )
int jie_cheng( int ) ;
void main( )
{
int a = 0,b = 0 , c = 0 ;
scanf("%d %d",&a,&b);
c = jie_cheng(a) / (jie_cheng(a-b)*jiecheng(b)) ;
printf("Zu he shu C is: %d\n", c);
}
int jie_cheng(int num)
{
if( num == 1)
return 1 ;
else
return num*jie_cheng(num-1) ;
}
❹ 函數式編程有什麼弊端
我接觸過Haskell、Clojure和其他語言,也做過PL的「研究」。可以淺談一下:
函數的復雜度
分析Haskell程序的時間和空間復雜度是很麻煩的。首先編寫Haskell程序往往是很多「重用」內置/自定義數據結構,以實現數據持久性(或「不變性」)可以增加空間和時間消耗(實現策略有很多,但採取臨時解決方案不影響永久治癒),優點是控制副作用。然後,函數組合和高階函數可能代價昂貴,可以生成額外的中間數據。其優點是抽象能力強,模塊化是有益的。最後,惰性評價使過程評價模型復雜,濫用可導致效率的降低。功能語言的分析工具也較少。
但是這些提供了細粒度的模塊化,程序員需要更多的「設計」。「使用函數式編程的程序員必須努力確保程序使用更小、更簡單、更通用的模塊,」Huges說。這是一個挑戰。
而且,模塊之間的交互也是一個問題。
❺ Java8的函數式編程怎麼樣
使用函數式代碼的好處:
減少了可變數(Immutable Variable)的聲明
能夠更好的利用並行(Parallelism)
代碼更加簡潔和可讀
函數式介面
函數式介面就是僅聲明了一個方法的介面,比如我們熟悉的Runnable,Callable,Comparable等都可以作為函數式介面。當然,在Java 8中,新添加了一類函數式介面,如Function,Predicate,Consumer,Supplier等。