標籤:

為什麼會有函數式編程?

函數式編程出現的背景是什麼,是為了解決什麼問題?


Conception, evolution, and application of functional programming languages


計算問題的研究的歷史比電子計算機久遠的多, 計算問題研究了哪些問題可以形式化求解及其演算法。最早追溯到帕斯卡,阿達和她的老師。

計算模型有兩個分支。丘奇的lambda計算和圖靈的圖靈機模型。兩種計算模型被證明是等價的。

這之後出現馮諾依曼架構和電子計算機。然後在機器語言和彙編語言的基礎上進化到高級語言。這一套語言是遵循圖靈機模型的。

另一方面,lambda計算被函數式編程發揚光大。而函數式編程也跟lambda計算一樣,關注點是在公理化和可證明。而命令編程語言的關注點在效率,正確,實用(實用的基礎上甚至可以犧牲正確性),快速開發快速發布。

命令式編程在理論上上升到語言學的層次,不可判定的問題很多,且為了實用引人更多的模糊地帶,是不夠嚴密的。而函數式編程關心語義,從數理邏輯出發建立基礎,例如三大語義,泛代數,可靠性完備性,合流,規約等概念,體系上更嚴密。而且視公理化為頭等大事。

一句話總結,函數式編程是從lambda計算模型出發的計算方法。

PS: 但我支持效率和實用優先

受某人啟發,補充一些內容,使答案更清晰。

函數式編程和命令式編程的起源分別是對計算問題的兩種研究方法,丘奇和圖靈,一個更重視形式化理論,一個更重視物理模型。二者並無高下之分,而且現在漸有合流之勢。實際上,函數式編程的具體實現需要運行在現實中的機器上,所以不能做到理論上那麼純粹,同時為了方便人類使用,也加入很多命令式編程的特性,比如副作用。而現代的命令式語言,也紛紛加入lambda表達式等特性。這種情況下人們會說,這個語言的這個特性是函數式的(例如匿名函數,高階函數,組合子,惰性求值等等)。但加入這些特性更多是因為函數式語言的簡潔優雅,而非其正確性。


我這篇還蠻對題的嘛:函數式編程的早期歷史 - 父母心 - 知乎專欄


函數式編程的開端比計算機都要早,,數學上的東西發展而來,其中λ演算是最重要的,還有其他的

推薦看 一個叫張淞的人,寫的Haskell的 入門書的前沿與正文的開頭部分,其中有講到函數式與Haskell的歷史

再補充點 有個叫 Simon Peyton Jones 的人,是微軟研究院的,他與其他幾個人一起寫個一個關於Haskell歷史的paper,應該在網上能找到,具體網址等我找見再發


歷史問題去查百度谷歌吧。年代久遠了,也不是一兩句能說明的。

解決什麼問題。函數式語言是圖靈完備的,也就是說命令式能解決的問題,函數式都能解決。當然了『能』與『適合』是兩碼事。

相比命令式,函數式最大的缺點就是慢,消耗更多的資源。這個在計算機發展的早期幾乎是致命傷。可是30年河西30年河東啊,隨著計算機性能的飛速提升,特別是是由單核變多核之後,函數式的優勢就凸顯了。函數式特別適合處理數據以及更適合併發。而且函數式結構較命令式更優美,可讀性強。這帶來的好處就是不容易出錯,易於維護。犧牲一點點性能能換來這麼多好處,在現在看來還是很值的。所以最近函數式火起來了。


按我學習Python的經驗,函數式編程是一套編程框架,就像樂高積木一樣,語言提供了一套比簡單的運算和條件判斷更高一層的運算元,比如循環、分支、笛卡爾積之類,讓編程者可以在更接近問題的地方進行編程:只要把各個組件按照需要組裝起來。

SQL是一個例子,裡面的表連接、求和、排序、計數等功能都是運算元,這些運算元雖然用更底層的變數、循環等也能實現,但容易出錯,也浪費開發精力。


不知道啥是函數編程,但是我知道計算1+2+3+…n用兩種方法計算效率完全不同

第一種

int sum;

for(int i=1;isum+=i;

第二種

int sum=((n+1)*n)/2;

這個屬於數學公式編程吧…

如果你說的是將代碼封裝在函數中,輸入函數名和參數即可調用這種方法……像我這種懶人,我覺得簡直爽啊,我輸出語句這種都封裝成函數P( )


推薦閱讀:

函數式編程能否解決所有經典的演算法問題?
想要理解函數式編程的思想,最好用哪種函數式編程語言入門?
Scheme語言中的「不可變數據」會產生性能問題嗎?
函數式編程如何優雅的處理很多 多個函數都要用到的 參數?
如何掌握函數式編程?

TAG:函數式編程 |