青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chenglong7997

函數式編程初探

誕生50多年之后,函數式編程(functional programming)開始獲得越來越多的關注。 

不僅最古老的函數式語言Lisp重獲青春,而且新的函數式語言也層出不窮,比如Erlang、Clojure、Scala,、F#等等。目前最當紅的Python、Ruby、Javascript,對函數式編程的支持都很強,就連老牌的面向對象的Java、面向過程的PHP,都忙不迭地加入對匿名函數的支持。越來越多的跡象表明,函數式編程已經不再只是學術界的最愛,也開始大踏步地在業界投入使用。 

也許繼"面向對象編程"之后,"函數式編程"會成為下一個編程的主流范式。未來的程序員恐怕或多或少都必須懂一點。 

但是,"函數式編程"看上去比較難,缺乏通俗的入門教程,各種介紹文章都充斥著數學符號和專用術語,讓人讀了如墜云霧。就連最基本的問題"什么是函數式編程?",網上都搜不到易懂的回答。 

下面是我(指本文作者阮一峰)的"函數式編程"學習筆記,分享出來,與大家一起探討。內容不涉及數學(Lambda Calculus我也不懂),也不涉及高級特性(比如lazy evaluationcurrying),只求盡量簡單通俗地整理和表達,我現在所理解的"函數式編程"以及它的意義。 

我主要參考了Slava Akhmechet的"Functional Programming For The Rest of Us"一文。 

一、定義 

簡單說,"函數式編程"是一種"編程范式",也就是如何編寫程序的方法論。 

它屬于"結構化編程"的一種,主要思想是把運算過程盡量寫成一系列嵌套的函數調用。舉例來說,現在有這樣一個數學表達式: 

(1 + 2) * 3 - 4 

傳統的過程式編程,可能這樣寫: 
代碼 
  1. var a = 1 + 2;  
  2.   
  3. var b = a * 3;  
  4.   
  5. var c = b - 4;  

函數式編程要求使用函數,我們可以把運算過程定義為不同的函數,然后寫成下面這樣: 
代碼 
  1. var result = subtract(multiply(add(1,2), 3), 4);  

這就是函數式編程。 

二、特點 

函數式編程具有五個鮮明的特點。 

1、函數是"第一等公民" 

所謂"第一等公民"(first class),指的是函數與其他數據類型一樣,處于平等地位,可以賦值給其他變量,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。 

舉例來說,下面代碼中的print變量就是一個函數,可以作為另一個函數的參數。 
代碼 
  1. var print = function(i){ console.log(i);};  
  2.   
  3. [1,2,3].forEach(print);  

2、只用"表達式",不用"語句" 

"表達式"是一個單純的運算過程,總是有返回值;"語句"是執行某種操作,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。 

原因是函數式編程的開發動機,一開始就是為了處理運算,不考慮系統的讀寫(I/O)。"語句"屬于對系統的讀寫操作,所以就被排斥在外。 

當然,實際應用中,不做I/O是不可能的。因此,編程過程中,函數式編程只要求把I/O限制到最小,不要有不必要的讀寫行為,保持計算過程的單純性。 

3、沒有"副作用" 

所謂"副作用"(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。 

函數式編程強調沒有"副作用",意味著函數要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。 

4、不修改狀態 

上一點已經提到,函數式編程只是返回新的值,不修改系統變量。因此,不修改變量,也是它的一個重要特點。

在其他類型的語言中,變量往往用來保存"狀態"。不修改變量,意味著狀態不能保存在變量中。函數式編程使用參數保存狀態,最好的例子就是遞歸。下面的代碼是一個將字符串逆序排列的函數,它演示了不同的參數如何決定了運算所處的"狀態"。 
代碼 
  1. function reverse(string) {  
  2.   
  3.     if(string.length == 0)  
  4.         {  
  5.       return string;  
  6.     }   
  7.         else   
  8.         {  
  9.            return reverse(string.substring(1, string.length)) + string.substring(01);  
  10.     }  
  11.   
  12.   }  

由于使用了遞歸,函數式語言的運行速度比較慢,這是它長期不能在業界推廣的主要原因。 

5、引用透明 

引用透明(Referential transparency),指的是函數的運行不依賴于外部變量或"狀態",只依賴于輸入的參數,任何時候只要參數相同,引用函數所得到的返回值總是相同的。 
有了前面的第三點和第四點,這點是很顯然的。其他類型的語言,函數的返回值往往與系統狀態有關,不同的狀態之下,返回值是不一樣的。這就叫"引用不透明",很不利于觀察和理解程序的行為。 

三、意義 

函數式編程到底有什么好處,為什么會變得越來越流行? 

1、代碼簡潔,開發快速 

函數式編程大量使用函數,減少了代碼的重復,因此程序比較短,開發速度較快。 

Paul Graham在《黑客與畫家》一書中寫道:同樣功能的程序,極端情況下,Lisp代碼的長度可能是C代碼的二十分之一。 

如果程序員每天所寫的代碼行數度基本相同,這就意味著,"C語言需要一年時間完成開發某個功能,Lisp語言只需要不到三星期。反過來說,如果某個新功能,Lisp語言完成開發需要三個月,C語言需要寫五年。"當然,這樣的對比故意夸大了差異,但是"在一個高度競爭的市場中,即使開發速度只相差兩三倍,也足以使得你永遠處在落后的位置。" 

2、接近自然語言,易于理解 

函數式編程的自由度很高,可以寫出很接近自然語言的代碼。 

前文曾經將表達式(1 + 2) * 3 - 4,寫成函數式語言: 

代碼 
  1. subtract(multiply(add(1,2), 3), 4)  

對它進行變形,不難得到另一種寫法: 
代碼 
  1. add(1,2).multiply(3).subtract(4)  

這基本就是自然語言的表達了。再看下面的代碼,大家應該一眼就能明白它的意思吧: 
代碼 
  1. merge([1,2],[3,4]).sort().search("2")  

3、更方便的代碼管理 

函數式編程不依賴、也不會改變外界的狀態,只要給定輸入參數,返回的結果必定相同。因此,每一個函數都可以被看做獨立單元,很有利于進行單元測試(unit testing)和除錯(debugging),以及模塊化組合。 

4、易于"并發編程" 

函數式編程不需要考慮"死鎖"(deadlock),因為它不修改變量,所以根本不存在"鎖"線程的問題。不必擔心一個線程的數據,被另一個線程修改,所以可以很放心地把工作分攤到多個線程,部署"并發編程"(concurrency)。 

請看下面的代碼: 
代碼 
  1. var s1 = Op1();  
  2.   
  3. var s2 = Op2();  
  4.   
  5. var s3 = concat(s1, s2);  

由于s1和s2互不干擾,不會修改變量,誰先執行是無所謂的,所以可以放心地增加線程,把它們分配在兩個線程上完成。其他類型的語言就做不到這一 點,因為s1可能會修改系統狀態,而s2可能會用到這些狀態,所以必須保證s2在s1之后運行,自然也就不能部署到其他線程上了。 

多核CPU是將來的潮流,所以函數式編程的這個特性非常重要。 

5、代碼的熱升級 

函數式編程沒有副作用,只要保證接口不變,內部實現是外部無關的。所以,可以在運行狀態下直接升級代碼,不需要重啟,也不需要停機。Erlang語言早就證明了這一點,它是瑞典愛立信公司為了管理電話系統而開發的,電話系統的升級當然是不能停機的。 

posted on 2012-04-09 01:48 Snape 閱讀(376) 評論(0)  編輯 收藏 引用 所屬分類: distributed system

導航

<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章分類

文章檔案

my

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内自拍亚洲| 久久精品国产亚洲一区二区三区| 欧美伊人久久大香线蕉综合69| 亚洲全黄一级网站| 亚洲直播在线一区| 欧美精品久久99| 亚洲国产网站| 99精品久久| 性欧美8khd高清极品| 鲁鲁狠狠狠7777一区二区| 国产婷婷成人久久av免费高清| 中文亚洲视频在线| 亚洲一级黄色| 亚洲美女免费精品视频在线观看| 欧美激情综合五月色丁香| 中日韩美女免费视频网站在线观看| 欧美精品一区二区三区久久久竹菊| 亚洲精品综合精品自拍| 亚洲福利一区| 欧美中文在线视频| 亚洲精品在线视频观看| 亚洲欧美视频在线| 国产精品自拍三区| 欧美在线91| 免费日本视频一区| 亚洲制服av| 国产精品视频不卡| 麻豆精品在线视频| 中文国产成人精品久久一| 亚洲美女视频在线观看| 欧美激情一区二区三区成人| 欧美大片91| 久久国产手机看片| 亚洲国产精品高清久久久| 久久手机免费观看| 久久精品视频99| 欧美吻胸吃奶大尺度电影| 欧美大片免费观看| 亚洲精选久久| 麻豆freexxxx性91精品| 最新日韩在线| 国产精品久久久久久av下载红粉| 欧美一级精品大片| 99精品欧美| 午夜精品久久久久久| 亚洲午夜视频在线观看| 国产亚洲精品美女| 亚洲免费视频观看| 久久久久成人精品免费播放动漫| 欧美国产精品v| 正在播放日韩| 亚洲一区二区少妇| 久久国产精品99精品国产| 欧美劲爆第一页| 国产欧美精品| 国产精品久久午夜| 免费观看不卡av| 久久精品一区二区三区不卡| 狠狠入ady亚洲精品经典电影| 欧美亚洲三级| 午夜精品一区二区三区在线播放| 午夜一区不卡| 欧美成人精品在线播放| 悠悠资源网亚洲青| 亚洲欧洲日本在线| 亚洲小视频在线观看| 久久精品1区| 亚洲小视频在线观看| 欧美激情1区2区3区| 国产欧美综合一区二区三区| 国产精品日本精品| 欧美精品一区二区久久婷婷| 欧美国产专区| 国产区欧美区日韩区| 在线观看三级视频欧美| 国产日韩精品一区二区| 国产精品成人免费视频| 免费欧美在线| 国产亚洲美州欧州综合国| 欧美在线免费一级片| 亚洲视频第一页| 母乳一区在线观看| 国产一区二区三区免费不卡| 一色屋精品亚洲香蕉网站| 亚洲欧洲日本专区| 久久精品人人做人人爽| 亚洲欧美在线看| 免费成人网www| 久久网站免费| 在线一区二区三区做爰视频网站| 一区二区久久久久久| 亚洲一区二区三区在线看| 国产精品99久久不卡二区| 亚洲精品视频一区| 久久婷婷激情| 黄色成人av网| 久久久久久久999| 亚洲欧美国产另类| 欧美日韩卡一卡二| 一个色综合导航| 午夜精品久久久久久久久久久| 欧美高清在线视频| 中文久久乱码一区二区| 久久精品国产999大香线蕉| 亚洲成色最大综合在线| 日韩亚洲视频在线| 欧美另类视频在线| 一本一本大道香蕉久在线精品| 欧美亚洲网站| 在线视频日韩| 亚洲综合欧美日韩| 欧美一区二区视频在线观看2020| 国产精品色午夜在线观看| 一本一本久久| 亚洲欧洲中文日韩久久av乱码| 午夜精品一区二区三区在线| 亚洲另类在线视频| 亚洲男女自偷自拍| 亚洲精品一区在线| 性欧美videos另类喷潮| 亚洲精品久久久久久一区二区| 久久久免费av| 国产一区二区三区久久悠悠色av| 久久一综合视频| 国产三区精品| 欧美一区三区三区高中清蜜桃| 国产日韩欧美一区二区| 久久精品99国产精品日本| 亚洲精品美女久久久久| 国产综合久久久久影院| 日韩视频久久| 久久成人18免费网站| 国内精品国产成人| 欧美美女喷水视频| 亚洲国产欧美不卡在线观看| 在线观看亚洲视频啊啊啊啊| 日韩视频免费观看| 亚洲国产成人av在线| 欧美电影电视剧在线观看| 欧美一区二区视频在线观看2020| 亚洲免费电影在线| 欧美欧美午夜aⅴ在线观看| 国产精品99久久久久久白浆小说 | 亚洲午夜在线视频| 欧美一级电影久久| 中文精品视频| 欧美日韩国产成人在线观看| 亚洲国产精品t66y| 亚洲巨乳在线| 欧美精品一区二区精品网 | 国产在线欧美| 久久亚洲私人国产精品va| 亚洲美女区一区| 久久夜色精品国产| 亚洲精品一区在线观看香蕉| 久久国产一区二区| 猛干欧美女孩| 久久综合久久综合久久| 久久久国产一区二区| 国产一区二区日韩精品欧美精品| 国产精品啊v在线| 亚洲一级在线观看| 欧美在线黄色| 日韩午夜激情| 亚洲一品av免费观看| 亚洲美女毛片| 国产欧美日韩| 国产精品美女久久久浪潮软件 | 亚洲一二区在线| 午夜精品一区二区三区电影天堂| 午夜精品一区二区三区电影天堂 | 99精品欧美一区二区三区| 亚洲综合色激情五月| 久久久久这里只有精品| 亚洲高清在线精品| 日韩午夜三级在线| 亚洲精品日产精品乱码不卡| 18成人免费观看视频| 国产日韩在线看| 黄色另类av| 亚洲一区视频在线| 久久狠狠婷婷| 亚洲人成绝费网站色www| 欧美亚洲午夜视频在线观看| 欧美jjzz| 午夜精品福利一区二区蜜股av| 亚洲成色www8888| 一本久久a久久免费精品不卡| 欧美承认网站| 久久久国产精品一区| 国产精品久久激情| 国产色产综合产在线视频| 伊人精品视频| 国产农村妇女毛片精品久久莱园子 | 久久久久久久综合色一本| 亚洲全黄一级网站| 亚洲欧美视频一区| 国产视频亚洲精品| 国产曰批免费观看久久久| 99综合在线|