亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

函數式編程(一) 認識“編程范式”和“函數”

2019-11-17 02:56:21
字體:
來源:轉載
供稿:網友

函數式編程(一) 認識“編程范式”和“函數”

2014-09-01 14:14 by xiaozhi_5638, ... 閱讀, ... 評論, 收藏, 編輯

編程范式(PRogramming paradigm)

  編程范式指我們在編寫程序解決問題的思路和視角。它提供了同時也決定了程序員對程序運行的看法。計算機編程中存在許多編程范式,如命令式編程、聲明式編程、面向對象編程以及結構化編程等等。其中面向對象編程范式認為程序是由一系列相互作用的對象組成,而結構化編程范式認為程序采用子程序、代碼區塊、for循環以及while循環等結構組成。下面主要說明本篇文章將要講到的命令式編程范式和聲明式編程范式。

1)命令式編程(Imperative):

強調程序代碼模擬電腦運行過程,強調“先做什么”、“再做什么”。如果我們要計算“2*3+1”,我們編寫代碼時先計算2*3存入臨時變量,再計算該臨時變量與1的和。命令式編程是當前主流編程范式,我們編寫的代碼幾乎都屬于命令式編程范式。

2)聲明式編程(Declarative):

強調程序代碼模擬人腦計算過程,強調“最終要什么”,相比命令式編程范式來講,它更看重結果而非過程。聲明式編程范式更接近人類思想,它的思考層面要高于命令式編程。

下圖顯示了命令式編程范式與聲明式編程范式的區別:

圖1

注:各種編程范式之間并非都是對立的,很多范式是從不同角度來劃分的。如面向對象編程范式同時也屬于命令式編程范式。當然,本篇文章講到的“命令式編程范式”和“聲明式編程范式”兩者是對立的。

聲明式編程范式

  聲明式編程范式常見有以下兩種(最常見):

1)領域特定語言(Domain Specific Language,DSL):

  名字很陌生,但是我們卻經常在用。如SQL、CSS以及正則表達式等等。這些語言只在特定領域起作用,并且使用這些語言時,我們大多數時候是在寫“陳述、聲明”的語句。如“select * from tb”,我們只關心我們要的結果,而不用去關系具體實現。

2)函數式編程(Functional Program,FP):

  函數式編程是我們要討論的重點。既然它屬于聲明式編程范式,那么它也應該強調結果(What)而非過程(How)。沒錯,函數式編程不同于常見的命令式編程,它不關心計算機具體的實現過程,而僅僅注重問題結果。

函數式編程(Functional Program):

  網上關于“函數式編程”的解釋有很多,但大多數都比較模糊抽象。維基百科上對函數式編程的解釋是“In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data”,翻譯成中文就是“函數式編程是一種編程范式,它將計算機運算看作是數學中函數的計算,并且避免了狀態以及變量的概念”。這是個什么意思呢?很多文章分別從函數式編程的幾個特點上做出了解釋,比如“函數是第一公民”、“高階函數(Higher Order Function”、“無狀態性(No State”、“無副作用性(Side-Effect”、“易于并行開發”以及“惰性求值”等等。但是我覺得這些都只是函數式編程的特點或者說是優點,并沒有實質上解釋出“函數式編程”與普通命令式編程的區別。我認為要搞清楚函數式編程,必須先認清“函數”的概念。沒錯,雖然我們自認為我們比較熟悉“函數”(或者叫“方法”,本文不區分這兩者的區別),但是我們真的熟悉它們嗎?

注:以后博客將依次介紹“函數式編程”以上幾種特點。

編程函數和數學函數:

第一次了解“函數”的概念應該是我們讀中學時,“y=x+1”在平面坐標系中是一條直線,到后來(不知道哪年級)學習了二次函數,“y=x^2+2*x+1”在平面坐標系中是一條拋物線。當時學習函數時知道以下知識點:

1)函數是一種映射,自變量經由一種映射關系變換后,得到因變量(函數值);

2)對于每個自變量,均能、有且僅有一個因變量與之對應,這是函數的確定性。也就是說,給定一個自變量,任何時候函數值都唯一;

那么,到大學學習編程后(本人讀大學才開始學習編程),我們在程序中又遇見了“函數”,很熟悉的感覺。但是它和數學中的函數有什么關聯呢?也就是說,數學思想與我們編程思想是否有關聯?如果以我們目前寫C#、java、C++等代碼來看,它們幾乎沒有關系,因為我們程序中的函數可以沒有參數(數學函數中的“自變量”),也可以沒有返回值(數學函數中的因變量),就算一個函數有返回值,那么給定參數,調用函數后每次運行結果也可能不一樣。以上這些均不能滿足數學函數的概念。其實出現“兩種函數幾乎無關系”的現象很容易理解,數學描述的是人類思維過程,而我們(目前大部分人)編寫的程序代碼描述的是計算機運行過程。在數學家與程序員之間早已產生了溝通障礙,比如下圖:

圖2

如上圖所示,“X=X+1”這種表達式如果從數學角度來看,幾乎是不可成立的,讓任何一個沒有學過編程的人去看這個表達式,TA都會以為你寫的是錯的,他們只認“Y=X+1”。原因很簡單,在程序中,符號可以代表變量,而變量表示一個內存單元,該內存處的值可以被重寫(賦值);而在數學中,符號永遠只是符號,等號“=”兩邊表示等價關系,“Y=X+1”表示Y與X+1是等價的,Y僅僅是X+1的一個代替符號。

  同理,函數也一樣。數學中的函數僅僅描述一種“映射關系”,給定一個自變量,我們可以得到一個因變量,僅此而已。而程序中的函數更多的時候扮演的是一種“功能”角色,它能夠完成指定任務。當然,如果程序中一個函數包含參數,并且能夠返回值,那么它完全可以模擬數學函數。下面使用C#編寫一個委托,它代表數學中的一個一元函數:

1 public delegate double Function1X(double x);

如上代碼所示,委托簽名中包含一個double類型參數,并且返回一個double類型返回值。數學中的“f(x)=x^2+2*x+1”可以使用C#編寫以下函數:

1 public double f(double x)2 {3      return Math.Pow(x,2) + 2*x + 1;4 }

函數f(x)在x=2處的值調用代碼:f(2);。或者使用Lambda表達式:

x => Math.Pow(x,2) + 2*x + 1;

程序中的函數接收一個double類型參數,經過映射關系,返回一個double類型的返回值,它與“f(x)=x^2 + 2*x +1”對應。那么數學函數中的二元函數在程序中怎樣表示呢?很簡單,二元函數包含兩個自變量,我們只需要為程序中函數定義兩個參數即可:

1 public delegate double Function2XY(double x,double y);

如上代碼所示,委托簽名中包含兩個double類型參數,并且返回一個double類型返回值。

  從上面的介紹可以看出,如果將程序中函數做一些限制,那么它就可以模擬數學中的函數了:

1)每個函數必須包含輸入參數(作為自變量);

2)每個函數必須有返回值(作為因變量);

3)無論何時,給定參數調用函數時,返回值必須一致。

上面第三條限制是為了滿足函數的“確定性”,該條限制要求程序中的函數執行期間不能依賴于外界因素,也不要影響外部環境。換句話說,它在執行期間與外界是隔絕的。我們將滿足以上條件的函數稱為“純函數(Pure Function”。純函數與外界交互只有一條渠道——傳入參數與返回值。純函數也不讀取/改變全局變量、無IO操作等。

圖3

純函數是程序代碼模擬數學函數的基礎。理論上講,函數式編程中,函數是第一公民的同時,所有函數也都應該屬于“純函數”。到此,我們再回過頭看一下維基百科上對“函數式編程”的解釋:函數式編程是一種編程范式,它將計算機運算看作是數學中函數的計算,并且避免了狀態以及變量的概念。很顯然,函數式編程向數學驗算靠攏,使用一種平時正常的數學思維去解決問題。

注:函數式編程是基于“lambda驗算(Lambda Calculus)”的,它并不屬于“圖靈機”理論范疇。我沒搞清楚lambda驗算,所以本文并沒詳細提到。看到Lambda很容易讓我們想到C#3.0中引入的Lambda表達式,這不是偶然。C# 3.0之后開始支持“函數式編程”,后面文章將會講到。

(未完待續)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区高清在线观看| 精品久久香蕉国产线看观看亚洲| 欧美日韩国产在线看| 亚洲精品99久久久久| 欧美国产日韩视频| 国产亚洲一区二区在线| 伊人久久五月天| 国产精品人成电影| 国a精品视频大全| 日韩免费精品视频| 欧美怡春院一区二区三区| 久久久国产在线视频| 欧美日韩在线视频观看| 亚洲一区精品电影| 国产精品久久久久久久7电影| 欧美日韩国产精品专区| 狠狠久久五月精品中文字幕| 亚洲一区二区少妇| 久久成人精品视频| 亚洲天堂av在线免费观看| 亚洲人成在线免费观看| 欧美日本啪啪无遮挡网站| 久久久久久国产精品久久| 国产一区二区三区在线| 日本一区二区在线免费播放| 成人做爰www免费看视频网站| 久久久久北条麻妃免费看| 国产日韩欧美中文| 亚洲九九九在线观看| 亚洲成人久久电影| 91精品久久久久久久久久久久久久| 91色琪琪电影亚洲精品久久| 夜夜嗨av一区二区三区免费区| 亚洲综合小说区| 国产免费一区二区三区在线观看| 亚洲第一精品夜夜躁人人躁| 国产91成人在在线播放| 欧美在线视频观看| 97av在线影院| 国产精品视频区| 91超碰caoporn97人人| 国产伦精品一区二区三区精品视频| 视频在线观看一区二区| 亚洲一区二区三区乱码aⅴ| 在线视频国产日韩| 这里只有精品视频| 国内精品久久久久久影视8| 欧美日韩一二三四五区| 国产亚洲精品综合一区91| 亚洲精品乱码久久久久久金桔影视| 久久天天躁狠狠躁老女人| 日韩视频精品在线| 亚洲电影免费观看高清完整版在线| 色综合久久精品亚洲国产| 国产精国产精品| 中文字幕亚洲一区| 日韩中文字幕在线观看| 精品国产一区二区三区久久狼黑人| 日韩av一区二区在线| 中文字幕综合在线| 日韩精品免费在线观看| 97婷婷大伊香蕉精品视频| 国产精品入口免费视| 亚洲国产精品成人精品| 日韩av在线精品| 日产精品久久久一区二区福利| 97色在线视频观看| 国产一区二区三区直播精品电影| 欧美日韩国产成人在线观看| 美女黄色丝袜一区| 97人洗澡人人免费公开视频碰碰碰| 97人人爽人人喊人人模波多| 午夜精品久久久久久久99热浪潮| 国内精品久久久久影院 日本资源| 亚洲第一色在线| 欧美在线免费看| 亚洲a∨日韩av高清在线观看| 久久综合亚洲社区| 一区二区国产精品视频| 精品久久久免费| 热久久这里只有精品| 国产精品自拍偷拍视频| 热门国产精品亚洲第一区在线| 91精品国产高清自在线看超| 欧美国产日韩一区二区在线观看| 国产成人精品日本亚洲| 亚洲在线第一页| 国产精品久久久久久久久免费| 亚洲午夜女主播在线直播| 亚洲3p在线观看| 亚洲欧洲成视频免费观看| 国产91精品久久久久久| 色综合91久久精品中文字幕| 国产成人精品优优av| 一区二区三区日韩在线| 国产女人精品视频| 欧美有码在线视频| 亚洲精品久久久久中文字幕欢迎你| 中文字幕欧美精品日韩中文字幕| 久久亚洲欧美日韩精品专区| 久久人人97超碰精品888| 亚洲国产婷婷香蕉久久久久久| 日韩欧美在线视频| 亚洲精品视频网上网址在线观看| 久久久久久午夜| 在线观看精品国产视频| 国内精品久久久久久影视8| 91久热免费在线视频| 日韩hd视频在线观看| 中日韩午夜理伦电影免费| 欧美中文字幕在线播放| 国产成人精品久久久| 日本高清不卡在线| 日韩一二三在线视频播| 狠狠色狠狠色综合日日五| 黄色成人av在线| 成人黄色影片在线| 亚洲国产成人精品久久久国产成人一区| 4388成人网| 日韩男女性生活视频| 97碰碰碰免费色视频| 欧美日韩ab片| 91在线观看免费观看| 亚洲欧美日韩在线一区| 亚洲第一国产精品| 亚洲国产高清自拍| 国产精品视频免费在线观看| 亚洲三级 欧美三级| 国产主播在线一区| 久久综合色88| 欧美日韩第一页| 成人免费黄色网| 性欧美xxxx| 久久婷婷国产麻豆91天堂| 亚洲第一网站男人都懂| 亚洲欧美激情四射在线日| 精品视频久久久| 韩国视频理论视频久久| 国产91色在线免费| 日韩欧美精品中文字幕| 亚洲色图美腿丝袜| 国产精品免费一区豆花| 国产日韩在线播放| 91色视频在线观看| 亚洲精品videossex少妇| 国产剧情日韩欧美| 精品调教chinesegay| 亚洲国产精品女人久久久| 91精品久久久久久综合乱菊| 日韩欧美在线第一页| 亚洲偷熟乱区亚洲香蕉av| 欧美激情视频播放| 亚洲国产欧美一区二区三区久久| 中文字幕在线看视频国产欧美在线看完整| 日本一区二区在线免费播放| 欧美乱人伦中文字幕在线| 91免费的视频在线播放| 成人在线视频福利| 欧美最猛性xxxx| 一本色道久久综合狠狠躁篇怎么玩| 91国内产香蕉| 亚洲人精选亚洲人成在线| 搡老女人一区二区三区视频tv| 91免费在线视频网站|