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

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>
            国产在线不卡精品| 国产精品久久看| 91久久精品国产91久久性色| 女人香蕉久久**毛片精品| 午夜精品美女久久久久av福利| 国产精品女主播| 久久精品国产免费观看| 久久精品五月婷婷| 亚洲激情另类| 亚洲精品在线一区二区| 国产精品免费一区豆花| 久久精品综合一区| 久热精品视频| 亚洲午夜一区二区三区| 亚洲欧美韩国| 亚洲国产合集| 夜夜嗨av色综合久久久综合网| 国产精品欧美日韩一区| 久久在线观看视频| 欧美日本国产精品| 欧美一区二区在线| 欧美激情成人在线| 欧美亚洲日本网站| 欧美成人精品h版在线观看| 亚洲综合色视频| 另类激情亚洲| 欧美一区二区三区播放老司机| 久久久www成人免费无遮挡大片 | 亚洲一区二区三区免费在线观看| 韩国av一区二区| 亚洲美女精品久久| 狠狠色狠狠色综合日日tαg| 亚洲精品在线免费| 悠悠资源网久久精品| 亚洲视频免费看| 最新国产乱人伦偷精品免费网站| 亚洲欧美另类国产| 99热免费精品| 久久最新视频| 久久久久成人精品| 国产精品日日摸夜夜添夜夜av| 欧美成人一区二区三区在线观看| 国产精品女主播| 亚洲欧洲综合另类| 国产一区二区三区直播精品电影| 99视频有精品| 亚洲美女黄网| 噜噜噜躁狠狠躁狠狠精品视频 | 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美日本精品| 亚洲图色在线| 欧美日韩成人在线| 欧美国产日韩精品免费观看| 国产一区二区高清不卡| 中日韩美女免费视频网址在线观看| 亚洲精品偷拍| 欧美jizz19hd性欧美| 欧美91视频| 伊人狠狠色j香婷婷综合| 宅男在线国产精品| 亚洲一区二区三区三| 欧美日本一区二区视频在线观看| 欧美成人午夜77777| 永久免费视频成人| 久久尤物视频| 欧美黄色免费网站| 亚洲国产高清aⅴ视频| 久久久久女教师免费一区| 久久久亚洲综合| 加勒比av一区二区| 久久一二三四| 亚洲国产一区在线| 亚洲看片网站| 欧美三区在线| 亚洲欧美成人精品| 久久精品国产亚洲aⅴ| 国产一区二区在线免费观看| 久久成人国产精品| 亚洲高清不卡| 一区二区三区高清视频在线观看| 欧美日韩久久久久久| 亚洲网站在线看| 久久精品欧洲| 亚洲欧洲三级| 欧美色欧美亚洲另类七区| 亚洲一区二区成人在线观看| 久久精品国产第一区二区三区| 韩国av一区二区三区四区| 卡一卡二国产精品| av成人激情| 久久久久久噜噜噜久久久精品| 亚洲福利电影| 国产精品v日韩精品| 欧美一区三区二区在线观看| 欧美大香线蕉线伊人久久国产精品| 日韩一级黄色av| 国产欧美日韩三区| 老司机午夜精品| 在线性视频日韩欧美| 久久精品一区四区| 99re在线精品| 国产亚洲综合精品| 欧美精品自拍偷拍动漫精品| 亚洲摸下面视频| 91久久嫩草影院一区二区| 午夜视频精品| 日韩午夜在线电影| 国产亚洲精品福利| 欧美日韩一区二区三区在线| 久久国产精品黑丝| 一本久久青青| 91久久中文| 久久综合国产精品| 午夜精品亚洲一区二区三区嫩草| 亚洲高清资源综合久久精品| 国产精品网站在线观看| 欧美精品videossex性护士| 欧美一区二区三区精品| 99亚洲精品| 亚洲国产精品成人| 麻豆91精品| 久久国产黑丝| 亚洲免费视频在线观看| 亚洲人成啪啪网站| 黄色工厂这里只有精品| 国产精品久久久久9999高清 | 欧美一级片在线播放| 日韩午夜电影av| 亚洲欧洲一区| 亚洲国产日韩欧美在线99 | 亚洲欧美一区二区三区久久| 亚洲破处大片| 亚洲国产精品久久久久久女王| 国产亚洲精品福利| 国产日产欧美精品| 国产精品爽爽爽| 国产乱码精品一区二区三| 欧美日韩精品欧美日韩精品| 欧美精品播放| 欧美日本成人| 欧美日韩一区二区三区在线| 欧美日韩国产色综合一二三四| 欧美激情第4页| 欧美精品免费在线| 欧美精品久久久久久久久老牛影院 | 亚洲激情成人在线| 亚洲人妖在线| 日韩网站免费观看| 一区二区三区免费看| 亚洲视频高清| 亚洲免费在线播放| 欧美一区二区日韩一区二区| 久久精品国产2020观看福利| 久久精品成人一区二区三区| 久久久免费精品| 欧美激情视频网站| 亚洲人成在线观看一区二区| 亚洲人成在线播放网站岛国| 亚洲美女av电影| 亚洲一区图片| 久久久之久亚州精品露出| 久久一综合视频| 欧美激情视频免费观看| 欧美日韩精品免费观看视频| 国产精品福利在线| 国产一区二区三区在线观看免费| 一区二区三区中文在线观看| 亚洲精选久久| 香蕉久久夜色精品国产| 麻豆精品视频在线观看| 亚洲日本中文| 亚洲欧美日韩国产一区二区三区| 久久av一区| 欧美日韩无遮挡| 精品成人在线| 亚洲一级在线观看| 浪潮色综合久久天堂| 亚洲人成77777在线观看网| 亚洲一区影音先锋| 美国成人直播| 国产欧美日韩一区| 最近中文字幕mv在线一区二区三区四区 | 激情久久久久| 制服诱惑一区二区| 久久综合九九| 一区二区三区欧美成人| 久久午夜国产精品| 国产精品久久久久久久久久免费 | 久久久噜噜噜久久| 一区二区三区日韩精品视频| 久久久久久久999| 国产精品久久777777毛茸茸| 亚洲国产欧美日韩| 久久精品亚洲国产奇米99| 亚洲三级毛片| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品捆绑调教| 99精品欧美一区二区蜜桃免费| 久久久久综合| 欧美亚洲综合久久|