版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
函數(shù)式編程初探誕生50多年之后,函數(shù)式編程(functionalprogramming)開始獲得越來越多的關(guān)注。不僅最古老的函數(shù)式語言Lisp重獲青春,而且新的函數(shù)式語言層出不窮,比如Erlang、clojure、Scala,、F#等等。目前最當紅的Python、Ruby、Javascript,對函數(shù)式編程的支持都很強,就連老牌的面向?qū)ο蟮腏ava、面向過程的PHP,都忙不迭地加入對匿名函數(shù)的支持。越來越多的跡象表明,函數(shù)式編程已經(jīng)不再是學術(shù)界的最愛,開始大踏步地在業(yè)界投入實用。也許繼"面向?qū)ο缶幊?之后,"函數(shù)式編程"會成為下一個編程的主流范式(paradigm)。未來的程序員恐怕或多或少都必須懂一點。但是,"函數(shù)式編程"看上去比較難,缺乏通俗的入門教程,各種介紹文章都充斥著數(shù)學符號和專用術(shù)語,讓人讀了如墜云霧。就連最基本的問題"什么是函數(shù)式編程",網(wǎng)上都搜不到易懂的回答。下面是我的"函數(shù)式編程"學習筆記,分享出來,與大家一起探討。內(nèi)容不涉及數(shù)學(LambdaCalculus我也不懂),也不涉及高級特性(比如lazyevaluation和currying),只求盡量簡單通俗地整理和表達,我現(xiàn)在所理解的"函數(shù)式編程"以及它的意義。我主要參考了SlavaAkhmechet的"FunctionalProgrammingForTheRestofUs"。一、定義簡單說,"函數(shù)式編程"是一種"編程范式"(programmingparadigm),也就是如何編寫程序的方法論。它屬于"結(jié)構(gòu)化編程"的一種,主要思想是把運算過程盡量寫成一系列嵌套的函數(shù)調(diào)用。舉例來說,現(xiàn)在有這樣一個數(shù)學表達式:(1+2)*3-4傳統(tǒng)的過程式編程,可能這樣寫:vara=1+2;varb=a*3;varc=b-4;函數(shù)式編程要求使用函數(shù),我們可以把運算過程定義為不同的函數(shù),然后寫成下面這樣:varresult=subtract(multiply(add(1,2),3),4);這就是函數(shù)式編程。二、特點函數(shù)式編程具有五個鮮明的特點。1.函數(shù)是"第一等公民"所謂"第一等公民"(firstclass),指的是函數(shù)與其他數(shù)據(jù)類型一樣,處于平等地位,可以賦值給其他變量,也可以作為參數(shù),傳入另一個函數(shù),或者作為別的函數(shù)的返回值。舉例來說,下面代碼中的print變量就是一個函數(shù),可以作為另一個函數(shù)的參數(shù)。varprint=function(i){console.log(i);};
[1,2,3].forEach(print);2.只用"表達式",不用"語句""表達式"(expression)是一個單純的運算過程,總是有返回值;"語句"(statement)是執(zhí)行某種操作,沒有返回值。函數(shù)式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。原因是函數(shù)式編程的開發(fā)動機,一開始就是為了處理運算(computation),不考慮系統(tǒng)的讀寫(I/O)。"語句"屬于對系統(tǒng)的讀寫操作,所以就被排斥在外。當然,實際應(yīng)用中,不做I/O是不可能的。因此,編程過程中,函數(shù)式編程只要求把I/O限制到最小,不要有不必要的讀寫行為,保持計算過程的單純性。3.沒有"副作用"所謂"副作用"(sideeffect),指的是函數(shù)內(nèi)部與外部互動(最典型的情況,就是修改全局變量的值),產(chǎn)生運算以外的其他結(jié)果。函數(shù)式編程強調(diào)沒有"副作用",意味著函數(shù)要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。4.不修改狀態(tài)上一點已經(jīng)提到,函數(shù)式編程只是返回新的值,不修改系統(tǒng)變量。因此,不修改變量,也是它的一個重要特點。在其他類型的語言中,變量往往用來保存"狀態(tài)"(state)。不修改變量,意味著狀態(tài)不能保存在變量中。函數(shù)式編程使用參數(shù)保存狀態(tài),最好的例子就是遞歸。下面的代碼是一個將字符串逆序排列的函數(shù),它演示了不同的參數(shù)如何決定了運算所處的"狀態(tài)"。functionreverse(string){
if(string.length==0){
returnstring;
}else{
returnreverse(string.substring(1,string.length))+string.substring(0,1);
}
}由于使用了遞歸,函數(shù)式語言的運行速度比較慢,這是它長期不能在業(yè)界推廣的主要原因。5.引用透明引用透明(Referentialtransparency),指的是函數(shù)的運行不依賴于外部變量或"狀態(tài)",只依賴于輸入的參數(shù),任何時候只要參數(shù)相同,引用函數(shù)所得到的返回值總是相同的。有了前面的第三點和第四點,這點是很顯然的。其他類型的語言,函數(shù)的返回值往往與系統(tǒng)狀態(tài)有關(guān),不同的狀態(tài)之下,返回值是不一樣的。這就叫"引用不透明",很不利于觀察和理解程序的行為。三、意義函數(shù)式編程到底有什么好處,為什么會變得越來越流行?1.代碼簡潔,開發(fā)快速函數(shù)式編程大量使用函數(shù),減少了代碼的重復(fù),因此程序比較短,開發(fā)速度較快。PaulGraham在《黑客與畫家》一書中寫道:同樣功能的程序,極端情況下,Lisp代碼的長度可能是C代碼的二十分之一。如果程序員每天所寫的代碼行數(shù)度基本相同,這就意味著,"C語言需要一年時間完成開發(fā)某個功能,Lisp語言只需要不到三星期。反過來說,如果某個新功能,Lisp語言完成開發(fā)需要三個月,C語言需要寫五年。"當然,這樣的對比故意夸大了差異,但是"在一個高度競爭的市場中,即使開發(fā)速度只相差兩三倍,也足以使得你永遠處在落后的位置。"2.接近自然語言,易于理解函數(shù)式編程的自由度很高,可以寫出很接近自然語言的代碼。前文曾經(jīng)將表達式(1+2)*3-4,寫成函數(shù)式語言:subtract(multiply(add(1,2),3),4)對它進行變形,不難得到另一種寫法:add(1,2).multiply(3).subtract(4)這基本就是自然語言的表達了。再看下面的代碼,大家應(yīng)該一眼就能明白它的意思吧:merge([1,2],[3,4]).sort().search("2")因此,函數(shù)式編程的代碼更容易理解。3.更方便的代碼管理函數(shù)式編程不依賴、也不會改變外界的狀態(tài),只要給定輸入?yún)?shù),返回的結(jié)果必定相同。因此,每一個函數(shù)都可以被看做獨立單元,很有利于進行單元測試(unittesting)和除錯(debugging),以及模塊化組合。4.易于"并發(fā)編程"函數(shù)式編程不需要考慮"死鎖"(deadlock),因為它不修改變量,所以根本不存在"鎖"線程的問題。不必擔心一個線程的數(shù)據(jù),被另一個線程修改,所以可以很放心地把工作分攤到多個線程,部署"并發(fā)編程"(concurrency)。請看下面的代碼:vars1=Op1();vars2=Op2();vars3=concat(s1,s2);由于s1和s2互不干擾,不會修改變量,誰先執(zhí)行是無所謂的,所以可以放心地增加線程,把它們分配在兩個線程上完成。其他類型的語言就做不到這一點,因為s1可能會修改系統(tǒng)狀態(tài),而s2可能會用到這些狀態(tài),所以必須保證s2在s1之后運行,自然也就不能部署到其他線程上了。多核CPU是將來的潮流,所以函數(shù)式編程的這個特性非常重要。5.代碼的熱升級
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國新型煙草行業(yè)開拓第二增長曲線戰(zhàn)略制定與實施研究報告
- 2025-2030年中國衛(wèi)星遙感行業(yè)全國市場開拓戰(zhàn)略制定與實施研究報告
- 2025-2030年中國空調(diào)維修與售后行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 新形勢下電子散熱材料及器件行業(yè)高速增長戰(zhàn)略制定與實施研究報告
- 中國移動互聯(lián)網(wǎng)APP行業(yè)發(fā)展趨勢預(yù)測及投資戰(zhàn)略研究報告
- 二年級數(shù)學(上)計算題專項練習匯編
- 春分文化與新媒介
- 管理層晉升述職報告
- 易制爆危險化學品購銷交易流程
- 二零二五年度大型貨車司機勞動合同范本與注意事項2篇
- 閱讀理解(專項訓練)-2024-2025學年湘少版英語六年級上冊
- 民用無人駕駛航空器產(chǎn)品標識要求
- 2024年醫(yī)院產(chǎn)科工作計劃例文(4篇)
- 2024-2025學年九年級英語上學期期末真題復(fù)習 專題09 單詞拼寫(安徽專用)
- 無創(chuàng)通氣基本模式
- 江西省贛州市尋烏縣2023-2024學年八年級上學期期末檢測數(shù)學試卷(含解析)
- 《臨床放射生物學》課件
- 腸造口還納術(shù)手術(shù)配合
- 2024年中考語文試題分類匯編:詩詞鑒賞(學生版)
- 中國音樂史與名作賞析智慧樹知到期末考試答案章節(jié)答案2024年山東師范大學
- 管廊維護與運營績效考核評分表
評論
0/150
提交評論