-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
12/13 新書到! 10/8 新書到! 10/1 新書到! 9/24 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

C#與F#編程實踐

( 簡體 字)
作者:賈洪峰類別:1. -> 程式設計 -> .NET -> C#
譯者:
出版社:清華大學出版社C#與F#編程實踐 3dWoo書號: 31265
詢問書籍請說出此書號!

缺書
不接受訂購

出版日:9/23/2011
頁數:546
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
不接受訂購
ISBN:9787302268901
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:




前言
本書不同于目前已有的許多其他編程書籍。它沒有僅專注于某一種特定的編程語言或程序庫,而是使用現有的語言和程序庫來解釋一種思維方式,這種思維方式的重要性日益增加,而且已經對許多新興技術產生了影響。
讀者可能已經了解了本書介紹的一些概念,因為函數式思想在許多技術中都有所體現。.NET領域的例子包括C# 3.0和LINQ項目、Microsoft Parallel Extensions to .NET以及Windows Presentation Foundation (WPF)中所使用的聲明性編程模型。在本書中,我們將在讀者已有的.NET和C#經驗基礎上,解釋函數式編程范例。我們將介紹微軟新推出的函數式編程語言F#,并用它將抽象思想變得更具體一些。如果可能,我們還會給出C#示例,這是因為在設計C#應用程序時,函數式思想也可以提供一些幫助。
如果我們要編寫一本專門介紹F#的書,可能會完全根據它的各個語言特征來組織篇章結構,并對這些特征進行逐一解釋。但本書整體上是關于函數式編程的,其結構基礎比較松散,也就是那些構成函數式范例的思想。這種組織方式要更困難一些,因為思想之間沒有清晰界限,經常是相互重疊的。
我們嘗試選出了一些思想,我們認為這些思想對于函數式編程入門者來說是最為重要的,并圍繞著這些思想來編寫本書。這一點在第Ⅱ部分尤其重要,這一部分系統地研究了函數式、高階函數和函數式程序的體系結構。這就意味著,有一些可用于快速演示函數式編程的例子(如處理數據集合的例子),不會僅在書中出現一次,而是在介紹各個新思想之后,在若干章節中逐漸開發這些例子。我們之所以決定采用這一方法,是因為它表明了函數式編程是如何從一小組簡單概念中優雅地發展而來的,就像函數式程序本身一樣。




致謝
“蝴蝶效應”,這個由Edward Lorenz創造的詞語是以混沌理論為基礎的:一個非常微小的事件,例如在亞洲某個地方的蝴蝶扇動了一下翅膀,可能會引起一個非常巨大的事件,如南美洲發生一次颶風。在概念上,蝴蝶扇動翅膀是固定的,而位置(亞洲或巴西)和結果(颶風或龍卷風)是變化的。其實說一句話就足夠了:有太多我無法在此一一列舉的人(和蝴蝶),沒有他們,就不可能有本書的存在。而且,即使我不相信混沌理論,我希望在此提到的人數也是非常龐大的。
如果不是遇到Don Syme,我可能永遠都不會對F#和函數式編程發生興趣。Don是我在微軟研究院兩個實習期內的導師,和他一起工作是一件非常愉快的事情,特別是在長時間地討論F#(還有生活、宇宙和其他各種話題)時。我還要感謝微軟研究院的James Margetson,他教給我許多很酷的函數式編程技巧。但是,如果我沒有成為微軟的MVP(最有價值專家),沒有遇到Luke Hoban,那我就不可能遇到Don和James,是Luke Hoban后來把我介紹給Don的。如果像這樣繼續下去,我還要提到Michal Blaha、Jan Stoklasa、Bo?ena Mannova,他們是CodeProject.com的作者,當然還要提到其他許多人。
如果沒有來自Manning的Mike Stephens,沒有Harry Pierson,這本書也不會存在,Mike Stephens是最早與我聯系的,沒有Harry Pierson的最初參與,我們可能永遠都不會著手編寫本書。盡管我們一起合作的時間很短暫,但Harry的參與非常重要,而且使我備受鼓舞。
沒有前面提到的這些人,就不可能開始編寫本書,以下要提到的這些人,沒有他們就不可能完成本書。
我非常感謝我的合著者Jon,感謝他幫助我度過了將初稿和草圖轉變為真正書籍的漫長過程。如果讀者感受到這本書就是為你而寫的,那也應當歸功于Jon,因為他從讀者的角度發出,將所有內容都調整為正確形式。最后還要說一聲,Jon是一個非常出色的合作者,無論是通過網絡,還是當面和他討論本書,都是一件非常愉快的事情。
現在,我要感謝Manning為本書做出貢獻的每一個人。我已經提到了Mike Stephens,他總是能夠雪中送炭。Nermina Miller和Tara McGoldrick Walsh對我在日常編寫過程中遇到的問題提供總體的指導性意見,而Mary Piergies和Liz Welch、Elizabeth Martin一起,幫助我找到具體解決方法。我還和Manning的其他許多優秀員工一起短暫合作過,他們是Gabriel Dobrescu、Steven Hong、Dottie Marsico、Christina Rudloff、Gordan Salinovic、Maureen Spencer和Karen Tegtmeyer。我還要感謝出版商Marjan Bace,他提供了無數非常有用的真知灼見。
Manning的人們還有一雙幸運之手,他們在編寫過程中的不同階段,挑選出正確的人選進行評論。我們收到大量的評論、建議和提示,還有相當數量的正面反饋,這些反饋意見鼓勵我盡可能多地考慮這些建議。除了我們的匿名評論者之外,我還要感謝我們的兩位技術評論者——Matthew Podwysocki和Michael Giagnocavo。我過去也曾經擔任過技術評論者,所以我非常了解他們的艱苦工作!還要特別感謝為本書作序的Mads Torgersen。
另外一群對本書提供寶貴建議的人們是早期草稿的讀者們。首先是我的同事Jan Stoklasa和Rene Stein,還有那些通過“Manning提前獲取計劃”(Manning Early Access Program)購買本書并在論壇中共享反饋的人們(如Dave Novick、Peer Reynders、Vladimir Kelman和Michiel Borkent等人)。其他一些對本書成文有所幫助的評價者包括:Marius Bancila、Freedom Dumlao、Eric Swanson、Walter Myers、Keith J. Farmer、Adam Tacy、Marc Gravell、Jim Wooley、Alessandro Gallo、Lester Lobo、Massimo Perga、Andrew Siemer、 Austin Ziegler、Dave McMahon、Jason Jung、Joshua Gan、Keith Hill、Mark Needham、Mark Ryall、Mark Seemann、Paul King和Stuart Caborn。
當然,我還要感謝我的朋友和家庭。他們可能并不知道,雖然他們的問題“你的書什么時候完成啊?”可能聽起來不像在鼓勵,但我非常了解他們,我衷心地感謝他們別樣的鼓勵。最后但絕非最不重要的一個,非常感謝我最親愛的Evelina,她不僅提供了非常寶貴的精神支持,還如此耐心地閱讀和評論了大部分手稿。

Tomas Petricek

我首先要感謝Tomas和Manning的每一個人,使我有機會參與本書的撰寫。能夠親身參與,盡綿薄之力,是非常有趣的,一方面從一本書中學習函數式編程,同時又將自己學到的東西融入一本書中,這一切讓我樂在其中。我只希望我所做的微薄貢獻能夠有所幫助——我主要是充當一個富有熱情但又無知的讀者(當然還是一個C#狂熱者),所以在某些方面,您現在讀到的這本書經過了一些調整,是用來教我學習函數式編程的。對我而言,它是一份值得感恩的禮物。Tomas已經向Manning的所有編輯和其他員工表示了感謝,我希望再一次向他們表示謝意。
我的孩子們還太小,不能開始編程,而我的妻子則太……怎么說呢?大體來說就是太正常了吧——但當我瘋狂工作時,我的孩子和妻子總是伴我左右,給我支持。我總是努力使自己保持頭腦清醒,能夠同時處理一本以上的書,而我的妻子(她撰寫童話)似乎總是在為各種不同書目和出版社忙碌著計劃書、詳細目錄、初稿、審稿、校稿和已提交的手稿。而且,她還嫁給了我——所有人都奇怪她是如何保持頭腦清醒的。但是,我非常高興她做到了,我要感謝她成為現在這樣一個人。Tom、Robin和William都很喜歡技術,在這方面大有前途,但當我從辦公室回到家中時,最喜歡的還是他們的微笑和擁抱。
最后,我還要感謝我的所有英語老師,特別是Simon Howells。我對編程語言的了解越多,我就越相信軟件工程師應當最為關注的語言就是他用來與人們進行交流的語言,而不是計算機語言。就像我對計算充滿激情一樣,Simon Howells對語言和文學也充滿著激情,這種激情給他的學生們留下了深刻印象。他很可能從來都不會閱讀我著作中的一個單詞,但他的教導將陪伴我一生。

Jon Skeet





關于本書
如果您是一位.NET開發人員,熟悉面向對象的技術,希望了解這場新的“函數式編程”運動都是關于什么內容的,還想知道如何從中獲益,那這本書絕對是為您而寫的。
本書是專門為那些擁有面向對象編程和C# 2.0工作經驗的.NET開發人員定制的。當然,一般來說,讀者不需要了解函數式編程,甚至不需要了解F#。事實上,如果已經習慣采用面向對象的方式來思考問題,那么在學習函數式編程時的難度會更大一些,因為許多函數式思想會顯得非常陌生。我們在編寫本書時已經考慮到這一點,所以在解釋特定主題時,我們經常會從讀者角度思考,并對OOP和函數式編程進行對比。
如果您是一位使用其他語言和工具(例如Java、Python或者Ruby)的面向對象程序員,能夠快速理解語言,那么也可以從本書中獲益。雖然我們給出的例子是采用C#編寫的,但其中有許多例子在其他面向對象式語言中都是非常相似的。對于其他語言中所不存在的C# 3.0功能,本書給出了簡要解釋,所以不用擔心會摸不到頭腦。
本書的核心不是函數式編程的學術問題,但如果您是一位計算機科學系的學生,正在學習相關課程,也可以閱讀本書,從中了解函數式概念的現實應用。
本書包含哪些主題
如果您還在猶豫本書是否適合自己,可以先看看本書包含的內容。
* 函數式編程概念。在閱讀本書時,您將學習一種新的問題思考方式,將會看到復雜的面向對象設計模式如何在函數式編程中變為一個簡單的概念。在使用任意一種語言進行編程時,都可以采用函數式思維方式,所以無論您使用哪種特定技術,它都是有用的。
* 實踐中使用的基本函數式結構。現在,在C# 3.0中已經可以使用這些結構中的一部分,所以在純粹的函數式F#實施方式旁邊,還會給出許多其他示例:用我們熟悉的C#代碼編寫而成。我們還將解釋C# 3.0中新增加的一些功能,以及它們與函數式思想的聯系。深入理解這些概念,可以幫助您從這些新功能中獲取最大利益。
* 編寫實用F#代碼。盡管本書并不是專門介紹F#的,但仍然會教給您足夠的知識,供您開始應用F#。我們還將研究一些能夠讓F#真正發揮實力的領域,包括異步編程和創建可組合庫等。
我們并不會宣稱本書在所有方面都是完美的:計算領域不存在“一體適萬用”的良方。應當知道,本書并不奢望讓所有讀者都滿意。
本書不涉及哪些內容
本書的編寫目標不是作為一本參考書。如果您還不熟悉函數式編程,閱讀本書的最佳方式就是從頭開始,然后按各章順序閱讀。我們假定讀者會這樣閱讀本書,所以后面的章節經常引用前面已經解釋過的概念。如果從本書中間開始閱讀,可能會發現理解起來比較困難。
本書也不是F#編程的快速指南。要想成為一位優秀的F#程序員,唯一的方法就是理解函數式編程思想。您可以學習所有F#關鍵字,并用F#重寫C#代碼,但這樣不會有太多好處。如果希望編寫出合乎慣例的F#代碼,那就需要學習函數式編程中所使用的一種不同思考方式。而這正是可以通過閱讀本書學到的東西。在習慣了函數式思維方式之后,可以閱讀其他書籍來幫助您更深入地學習F#。
我們的主要目的是編寫一本書,可以幫助專業程序員編寫一些解決方案,以解決現實世界的業務問題。但是,這并不意味著我們會為您提供一種現成的解決方案,用來解決您眼前需要解決的問題,而是主要介紹相關概念和技術。我們用許多例子來說明這些原理,但不可能涵蓋F#和函數式編程的全部適用領域。
路線圖
本書采用了一種重復式結構。在第Ⅰ部分(第1至4章),我們將解釋最重要主題中的一些內容,使您可以體會到學習的動力,并理解是什么使函數式編程不同于其他編程方式。第Ⅱ部分(第5至8章)系統地討論了函數式編程的基礎。在第Ⅲ部分(第9至12章),我們將在此基礎上,討論函數式編程、優化的最佳實踐,還要討論大多數函數式程序員偶爾會用到的高級技巧。第Ⅳ部分(第13至16章)給出了一些更為復雜的例子,展示如何使用函數式編程來開發更大的現實世界項目。
第1章討論了是什么原因使函數式概念變得日益重要。它給出一些現有技術的例子,您對這些技術可能已經有所了解,而且這些技術已經從函數式編程的某些方面獲益。這一章還給出了用F#編寫的第一個示例應用程序。
第2章介紹了函數式編程背后的概念。它沒有給出任何細節,而且主要使用C#,從而可以幫助讀者理解這些概念之間的相互關系,以及它們對于程序結構意味著什么。
第3章終于給出了一些實際函數代碼。它介紹了F#中用到的一些數據類型,例如元組和列表。我們還會看到如何處理F#中的類型,但也會用C#來實現它們,以解釋它們是如何工作的。這一章介紹了將函數作為值來使用的思想,它對于函數式編程是非常重要的。
第4章給出了第一個用F#實現的現實世界應用程序。我們將使用各種.NET和F#庫來實現一個用于繪制餅圖的程序。在該章還將看到如何在開發過程中有效使用F#所提供的工具。
第5章對值進行了討論。函數式程序被編寫為一些計算式,它們取得參數值,返回結果值,因此,很容易就可以看出,為什么在開始系統地評論函數式功能時,必須首先研究各種各樣的值。
第6章描述了處理值的最常用方式,也就是使用高階函數。直接對值進行處理,經常需要大量的重復代碼,所以本章介紹了如何設計和實施可重復使用的操作。
第7章將注意力轉移到體系結構方面。函數式應用程序的結構由其要處理的數據確定。我們將使用一個管理和繪制簡單文檔的應用程序來說明這一重要原理。
第8章主要關注一些應用程序的體系結構,這些應用程序需要在運行時動態改變其行為。這一功能可以使用函數來實現,所以我們將詳細討論它們,還將解釋諸如閉包之類的相關主題。
第9章說明如何在F#中混合使用面向對象式風格和函數式風格。它說明在編寫函數式.NET庫時,如何將函數式功能(例如不變性)與面向對象概念(如封裝)結合使用。
第10章主要介紹正確性和效率。我們將看到如何編寫能夠處理任意大小數據集的函數,以及如何高效率地編寫這些函數。您還會學習如何使用諸如數組之類的命令式結構來優化代碼。
第11章討論重構、測試和延遲。采用函數式編程時,對已有代碼的理解和改進將變得更為容易,在本章將解釋是如何做到的。我們將研究單元測試,了解如何因為具有了可組合性和嚴格性而不再需要進行某些種類的測試。
第12章開始展示如何處理數據集合。我們將介紹F#序列表達式,它是專門為這一目的設計的。您還會看到它不是一個內置功能,這一點不同于C#中與它最接近的對應內容,序列表達式是一種可以改變代碼含義的更通用功能。
第13章展示了一種在F#中處理數據時的常見場景。它首先使用一種公共Web服務下載數據,然后將其解析為一種結構化格式。最后將會看到如何使用Excel對其中有意義的內容進行可視化。
第14章介紹如何利用函數式概念來生成易于并行處理的代碼。該章使用一個圖像處理應用程序和一個模擬來進行展示,在這個模擬中存在一些動物和獵取這些動物的捕食者。
第15章介紹如何構建聲明性函數庫。該章表明,可以優美地組合那些經過精心設計的庫。在示例中,我們將看到如何創建一個生成動畫的庫和一個表示經濟合同的庫。
第16章介紹如何生成GUI應用程序,籠統而言是如何生成由外部事務驅動的程序。在其他語言中,要實現諸如此類的控制流是非常困難的,我們將學習一些技巧,利用這些技巧,可以非常容易地在F#中實現它。
印刷約定
本書包含大量代碼示例,它們采用等寬字體排版。較長示例都展示在帶有標題的代碼清單中。由于本書混合采用了C#和F#,所以,在代碼清單中,其標題還指出了所使用的語言。在展示用F#編寫的代碼時,我們在兩種代碼清單形式之間進行了區分。標有“F#”的代碼是無格式源代碼,可以作為整體進行編譯。而標有“F# Interactive”的代碼清單給出了以F#編寫、輸入到交互式外殼(shell)的代碼段。由該外殼生成的輸出使用斜體。在所有代碼清單中,所有C#和F#關鍵字都使用等寬字體的粗體突出顯示。
命名約定
在本書中,我們不僅混合使用了兩種語言,還將函數式編程慣例與面向對象式慣例混合在一起。由于我們希望使用兩種語言的自然風格,所以必須遵循F#和C#中的不同命名約定。
在C#中,我們遵循通常的.NET風格。在F#中,我們在開發類或者編寫可以從其他.NET語言訪問的組件時,也毫無例外地使用這種符號體系。而在展示僅作為私有實現的F#代碼時,我們將遵循函數式命名風格。更特別的是,對于變量和函數名稱均采用camelCase風格。這是F#中的標準風格,因為函數聲明基本上與變量聲明相同。
偶爾,我們會使用較短的名稱和縮寫,其中有兩個原因。第一,函數式程序員經常使用這種風格。有了更好的IDE,使用這一風格的理由就比較少了,所以我們盡量減少它的使用。在某些情況下,較短名稱是函數式編程的常見術語,所以我們還是保留了它。第二,有時我們會并排使用兩個示例,這就意味著我們必須使用一種更緊湊的編碼風格。在其他情況下,大多數命令遵循.NET風格,也有幾種例外,在正文中將對其進行討論。
StyleCop和FxCop
如果讀者熟悉諸如StyleCop和FxCop之類的代碼分析工具,可能了解本書中的代碼是否符合這些工具所要求的規則。我們遵循了大多數(但并非全部)通常的.NET約定。如果通過這些工具來運行代碼,會產生大量警告信息,其中同樣有兩個原因。
* 這些代碼分析工具是為面向對象式語言開發的,而這些語言使用的命名規則與風格是符合面向對象慣例的。在本書中將會了解到,函數式世界在許多方面是有所不同的,我們不能遵循所有的面向對象式原則。F#是非常成功的,就是因為它非常不用于C#和Visual Basic。從語言關鍵字中看不出什么,但在它所采用的整體編程風格方面可以明顯表現出來,在命名約定方面也有所體現,這種命名約定使代碼更為緊湊。
* 本書的篇幅有限。我們使用源代碼示例來演示重要的思想,所以我們不希望包含一些對于這些討論并不重要而只是為了使代碼符合約定而產生的干擾性內容。
源代碼下載
本書示例的源代碼可從出版商的網站上聯機下載:http://www.manning.com/Real-WorldFunctionalProgramming,也可以從作者創建的代碼庫中下載:http://code.msdn.microsoft.com/realworldfp。
作者在線
購買本書之后,還可以免費訪問由Manning運轉的一個專用Web論壇,在這里可以對本書進行評論,詢問技術問題,并接受來自作者及其他用戶的幫助。要訪問該論壇并訂閱它,可在Web瀏覽器中打開http://www.manning.com/Real-WorldFunctionalProgramming。該網頁將提供一些信息,告訴您在注冊之后如果進入該論壇,可以獲得哪些方面的幫助,以及該論壇中的一些行為規則。
Manning對讀者的承諾是提供一種場合,供各位讀者之間、讀者與作者之間進行有意義的對話。關于作者的參與程度問題,并不做出承諾,作者們對本書論壇的貢獻是自愿的(也是沒有報酬的)。我們建議讀者詢問一些富有挑戰性的問題,以免作者失去留在這里的興趣!
在本書付印時,“作者在線”論壇及前面討論的歸檔文件,都可以從出版商的網站上下載。
其他在線資源
除了Manning的網站(http://www.manning.com/Real-WorldFunctionalProgramming)之外,我們還為本書創建了一個配套網站:http://functional-programming.net。其中包含了一些可能對讀者有用的信息、各章的源代碼以及沒有收入本書中的內容。這個網頁還鏈接到最近發表的一些與函數式編程有關的文章,讀者可以閱讀這些內容,了解有關這一主題的更多內容。
如果您對F#感興趣,可能還希望查看微軟開發人員中心的官方網站:http://msdn.microsoft.com/fsharp。其中包含有關該語言的最新信息,以及指向文章、視頻或其他F#資源的鏈接。如果希望詢問有關F#的問題,并確保會得到滿意的回答,請訪問F#社區論壇:http://cs.hubfs.net。




封面介紹
本書封面上的畫像題為“雇員”,它顯示了一個辦公室職員或文職人員,衣著優雅,頭戴禮帽,還攜帶著一把雨傘。這幅圖取自19世紀法國出版的Sylvain Marechal四卷本地區衣著風俗綱要。每一幅圖都是手工精心繪制和著色的。Marechal作品集的多樣性生動地提醒了我們,僅僅在200多年以前,世界上的村鎮、地區在文化上有多大差異。由于相互隔離,人們說著不同的方言。在街道上或者在鄉村中,只需要看看穿著,就可以很輕松地判斷出人們生活在哪里,做什么生意,從事什么職業或者是什么身份。
從那以后,穿著代碼發生了變化,當時非常明顯的區域差異已經不復存在了。現在很難區分不同大陸的居民,更不要說不同村鎮或地區了。也許我們已經用文化的多樣性換取了一種更加多樣化的個人生活,當然是換了一種更多樣化、速度更快的技術性生活。
在這樣一個很難將一本計算機書籍同其他書籍區分開來的時代,Manning獨創性地為計算機書籍選用表現兩個世紀以前地區生活多樣性的圖片作為封面,用Marechal的圖片讓我們回歸生活。

  

內容簡介:

本書旨在介紹用于解決現實問題的函數式思想及相關技巧。盡管本書給出了很多用F#和C#兩種語言編寫的示例,但其重點在于闡述思想,而不是介紹F#或C#語言。
    本書的主要內容包括:如何用函數式思維方式來思考問題;如何將面向對象編程與函數式編程結合起來;如何編寫高效的F#代碼。要閱讀本書,最好具備OOP和C# 2.0編程經驗,不需要具備有關函數式編程或F#的基礎知識。
    本書的適用對象是具備上述經驗并希望了解函數式編程的.NET開發人員。計算機專業的學生也可以通過閱讀本書,了解函數式概念的現實應用。


目錄:

第Ⅰ部分 學習函數式思維方式


第1章 不同的思維方式 3
1.1 什么是函數式編程 4
1.2 通向現實世界函數式編程的途徑 6
1.2.1 函數式語言 6
1.2.2 .NET平臺上的函數式編程 7
1.3 用函數式編程提高生產效率 7
1.3.1 函數式范例 8
1.3.2 聲明性編程風格 8
1.3.3 理解程序所做的工作 10
1.3.4 并發友好的應用編程 11
1.3.5 函數式風格如何塑造代碼 11
1.4 函數式編程舉例 13
1.4.1 使用聲明性風格表明目的 13
1.4.2 理解使用不可變性的代碼 18
1.4.3 編寫高效的并行程序 21
1.5 介紹F# 23
1.5.1 F#中的Hello world程序 24
1.5.2 從簡單到現實世界 25
1.6 小結 29
第2章 函數式編程的核心概念 30
2.1 函數式編程的基礎 31
2.2 函數式程序的求值 33
2.2.1 處理不可變值 33
2.2.2 使用不可變數據結構 35
2.2.3 使用遞歸改變程序狀態 36
2.2.4 使用表達式而不是語句 37
2.2.5 計算式運算 38
2.3 編寫聲明性代碼 41
2.3.1 以函數為值 41
2.3.2 高階函數 43
2.4 函數式類型和值 46
2.4.1 C#和F#中的類型推斷 47
2.4.2 可區分聯合類型簡介 49
2.4.3 模式匹配 50
2.4.4 編譯時程序檢查 53
2.5 小結 55
第3章 F#和C#中的元組、列表與函數 56
3.1 值和函數聲明 57
3.1.1 值聲明與作用域 57
3.1.2 函數聲明 59
3.1.3 聲明可變值 61
3.2 使用不可變數據結構 62
3.2.1 元組類型介紹 62
3.2.2 在C#中實現元組類型 65
3.2.3 用元組進行計算 67
3.2.4 對元組使用模式匹配 68
3.3 列表和遞歸 70
3.3.1 遞歸計算 71
3.3.2 函數式列表簡介 72
3.3.3 C#中的函數式列表 76
3.3.4 函數式列表處理 77
3.4 將函數用作值 79
3.4.1 處理數值列表 80
3.4.2 參數化函數的好處 83
3.5 小結 84
第4章 F#與.NET庫應用實例 85
4.1 用F#繪制餅圖 85
4.2 在FSI中編寫和測試代碼 87
4.2.1 加載和解析數據 87
4.2.2 用數據進行計算 90
4.3 創建一個控制臺應用程序 93
4.4 創建一個Windows Forms應用程序 96
4.4.1 創建用戶界面 97
4.4.2 繪制圖片 100
4.4.3 創建Windows應用程序 106
4.5 小結 108


第Ⅱ部分 基本函數式技巧


第5章 在局部使用函數式值 111
5.1 值是什么 112
5.1.1 基元類型、值類型和對象 112
5.1.2 識別值和數據 112
5.2 多個值 113
5.2.1 F#和C#中的多個值 113
5.2.2 元組類型和值構造器 115
5.2.3 以組合方式使用元組 117
5.3 備選值 118
5.3.1 F#中的可區分聯合 120
5.3.2 處理備選內容 121
5.3.3 添加類型還是函數 123
5.3.4 使用F#中的option類型 125
5.4 泛型值 127
5.4.1 在C#中實現option類型 128
5.4.2 F#中的泛型option類型 131
5.4.3 對值的類型推斷 133
5.4.4 編寫泛型函數 135
5.5 函數性值 136
5.5.1 lambda函數 139
5.5.2 函數類型 142
5.5.3 多參數函數 144
5.6 小結 148
第6章 使用高階函數處理值 149
6.1 泛型高階函數 150
6.1.1 用F#語言編寫泛型函數 151
6.1.2 自定義運算符 151
6.2 處理元組 154
6.2.1 使用函數處理元組 155
6.2.2 C#中處理元組的方法 157
6.3 處理日程安排 158
6.3.1 日程安排列表的處理 160
6.3.2 用C#處理日程安排 161
6.4 處理option類型 162
6.4.1 使用map函數 163
6.4.2 使用bind函數 163
6.4.3 逐步對示例輸入求值 165
6.4.4 為option類型實現操作 167
6.5 處理函數 168
6.5.1 函數組合 169
6.5.2 C#中的函數組合 171
6.6 類型推斷 172
6.6.1 F#中對函數調用的類型推斷 173
6.6.2 自動泛化 173
6.7 處理列表 175
6.7.1 在F#中實現列表 175
6.7.2 理解列表函數的簽名 176
6.7.3 實現列表函數 180
6.8 公用處理語言 183
6.8.1 映射、篩選和折疊 183
6.8.2 對列表的bind操作 185
6.9 小結 186
第7章 設計以數據為中心的程序 187
7.1 函數式數據結構 188
7.1.1 使用F#記錄類型 189
7.1.2 C#中的函數式數據結構 191
7.2 平面文檔表示法 192
7.2.1 繪制元素 194
7.2.2 在窗體上顯示繪制的內容 195
7.3 結構化文檔表示法 198
7.3.1 轉換表示法 199
7.3.2 XML文檔表示法 202
7.4 編寫操作 206
7.4.1 使用map操作進行更新 206
7.4.2 使用聚合操作進行計算 209
7.5 面向對象式表示法 211
7.5.1 用結構型模式表示數據 211
7.5.2 使用訪問者模式添加函數 214
7.6 小結 216
第8章 設計以行為為中心的程序 217
8.1 使用行為集合 218
8.1.1 將行為表示為對象 218
8.1.2 在C#中將行為表示為函數 219
8.1.3 在C#中使用函數集合 221
8.1.4 在F#中使用函數列表 222
8.2 用于處理函數的術語 224
8.2.1 策略設計模式 224
8.2.2 命令設計模式 225
8.2.3 在F#中使用閉包來采集狀態 228
8.3 處理組合行為 233
8.3.1 函數的記錄 233
8.3.2 構造組合行為 235
8.3.3 F#代碼的進一步演進 236
8.4 結合數據與行為 238
8.4.1 決策樹 238
8.4.2 F#中的決策樹 239
8.4.3 C#中的決策樹 242
8.5 小結 245


第Ⅲ部分 高級F#編程技術


第9章 將值轉換為帶有成員的F#對象類型 249
9.1 改進以數據為中心的應用程序 249
9.1.1 向F#類型添加成員 251
9.1.2 使用類型擴展追加成員 254
9.2 改進以數據為中心的應用程序 256
9.2.1 使用函數記錄 257
9.2.2 使用接口對象類型 258
9.3 處理.NET接口 260
9.3.1 使用.NET集合 260
9.3.2 使用IDisposable清除資源 262
9.4 具體對象類型 265
9.4.1 函數式類和命令式類 267
9.4.2 實現接口和轉換 269
9.5 從C#中使用F#庫 273
9.5.1 處理記錄和成員 274
9.5.2 處理值和委托 276
9.6 小結 278
第10章 數據結構的效率 279
10.1 優化函數 279
10.1.1 用尾遞歸避免堆棧溢出 280
10.1.2 使用記憶化緩存結果 285
10.2 處理大型集合 291
10.2.1 再次用尾遞歸避免堆棧溢出 291
10.2.2 高效地處理列表 294
10.2.3 處理數組 296
10.3 “延續”簡介 301
10.3.1 樹處理的困難所在 301
10.3.2 使用“延續”編寫代碼 303
10.4 小結 306
第11章 函數式程序的重構與測試 307
11.1 重構函數式程序 308
11.1.1 重復使用公共代碼塊 308
11.1.2 跟蹤相關性和副作用 311
11.2 測試函數式代碼 314
11.2.1 從交互式外殼程序到單元測試 315
11.2.2 編寫利用結構等同性的測試 319
11.2.3 測試組合功能 322
11.3 重構計算順序 323
11.3.1 不同的計算策略 324
11.3.2 計算策略對比 325
11.3.3 使用函數來模擬延遲計算 326
11.3.4 F#中的延遲值 328
11.3.5 為C#實現延遲值 330
11.4 在實踐中使用延遲值 332
11.4.1 無限列表 332
11.4.2 緩存圖片瀏覽器中的值 335
11.5 小結 338
第12章 序列表達式和備選工作流 339
12.1 生成序列 340
12.1.1 使用高階函數 340
12.1.2 使用C#中的迭代器 341
12.1.3 使用F#序列表達式 342
12.2 掌握序列表達式 345
12.2.1 遞歸序列表達式 345
12.2.2 使用無限序列 347
12.3 處理序列 352
12.3.1 用迭代器轉換序列 352
12.3.2 篩選與投影 353
12.3.3 平展投影 356
12.4 介紹備選工作流 361
12.4.1 自定義查詢表達式 361
12.4.2 自定義F#語法 363
12.5 自定義計算中的第一步 365
12.5.1 聲明計算類型 365
12.5.2 編寫計算 366
12.5.3 在F#中實現一個計算構造器 367
12.5.4 在C#中實現查詢運算符 369
12.6 為選項實現計算表達式 371
12.7 用記錄來補充計算 373
12.7.1 創建記錄計算 374
12.7.2 創建記錄計算 375
12.7.3 使用計算表達式進行重構 377
12.8 小結 378

第Ⅳ部分 應用函數式編程


第13章 異步與數據驅動編程 381
13.1 異步工作流 382
13.1.1 異步工作流為什么重要 382
13.1.2 異步下載網頁 383
13.1.3 理解工作流的工作原理 387
13.1.4 創建基元工作流 389
13.2 連接到世界銀行 391
13.2.1 訪問世界銀行的數據 391
13.2.2 從失敗中恢復 393
13.3 瀏覽和獲取數據 395
13.3.1 實現XML helper函數 395
13.3.2 提取區域代碼 397
13.3.3 獲取指標 399
13.4 從數據中收集信息 402
13.4.1 讀取值 402
13.4.2 使用度量單位設置數據格式 403
13.4.3 收集有關地區的
統計數字 407
13.5 使用Excel實現數據可視化 408
13.5.1 將數據寫入Excel 409
13.5.2 在Excel圖表中顯示數據 411
13.6 小結 413
第14章 編寫并行函數式程序 414
14.1 理解不同的并行技術 415
14.1.1 并行處理命令式代碼的孤島 415
14.1.2 聲明性數據并行 417
14.1.3 基于任務的并行機制 421
14.2 并行運行圖形效果 426
14.2.1 在F#中計算顏色 426
14.2.2 實現和運行顏色濾鏡 428
14.2.3 設計主應用程序 431
14.2.4 創建和運行效果 433
14.2.5 實現應用程序的并行化 437
14.2.6 實現模糊效果 439
14.3 創建并行模擬 441
14.3.1 表示模擬世界 442
14.3.2 設計模擬操作 444
14.3.3 實現helper函數 447
14.3.4 實現智能動物與捕食者 449
14.3.5 并行運行模擬 451
14.4 小結 453
第15章 創建可組合函數庫 455
15.1 可組合設計方法 456
15.1.1 由符號組合動畫 456
15.1.2 為符號賦予含義 457
15.1.3 組合值 458
15.1.4 組合函數和對象 459
15.2 創建動畫值 463
15.2.1 函數式動畫簡介 463
15.2.2 行為簡介 464
15.2.3 在C#中創建簡單行為 466
15.2.4 在F#中創建簡單行為 468
15.3 編寫處理行為的計算 469
15.3.1 讀取值 470
15.3.2 向行為應用函數 471
15.3.3 將函數轉換為“行為函數” 472
15.3.4 在C#中實現提升和map 474
15.4 處理圖畫 477
15.4.1 表示圖畫 477
15.4.2 創建和組合圖畫 479
15.5 創建動畫 483
15.5.1 在F#中實現動畫窗體 483
15.5.2 使用行為創建動畫 486
15.5.3 添加動畫基元 488
15.5.4 創建一個太陽系動畫 490
15.6 開發經濟建模語言 493
15.6.1 經濟合同建模 493
15.6.2 定義基元 494
15.6.3 使用建模語言 496
15.7 小結 498
第16章 開發函數式反應程序 499
16.1 使用事件的反應式編程 500
16.1.1 事件函數簡介 501
16.1.2 使用事件和可觀察對象 502
16.1.3 創建一個簡單的反應式應用程序 505
16.1.4 使用LINQ進行聲明性事件處理 507
16.1.5 在F#中聲明事件 509
16.2 創建反應式動畫 511
16.2.1 使用switch函數 511
16.2.2 實現switch函數 513
16.3 使用工作流進行UI編程 514
16.3.1 異步等待事件 514
16.3.2 繪制矩形 517
16.4 在反應式應用程序中存儲狀態 521
16.4.1 安全地處理狀態 521
16.4.2 創建郵箱處理器 521
16.4.3 使用消息進行通信 524
16.4.4 封裝郵箱處理器 528
16.4.5 等待多個事件 529
16.5 消息傳送并發性 531
16.5.1 創建狀態機處理器 532
16.5.2 并發訪問郵箱 534
16.6 小結 535
附錄 展望 537
快速參考 函數式編程概念 540
快速參考 F#語言構造 542
資源 544
序: