C++ 函數式編程 (Functional Programming in C++: How to improve your C++ programs using functional techniques)

Ivan Cukic 程繼洪,孫玉梅,婁山佑譯

買這商品的人也買了...

商品描述

《C++函數式編程》介紹了C++的面向函數式編程。
面向函數式編程是繼面向對象編程之後又一編程範式,解決了命令式(過程式)
編程與面向對象編程中出現的問題,是一種J具潛力的編程方式,值得研究學習。
主要講解了函數對象、純潔性(Purity)、惰性求值、range、函數式數據結構、
代數類型及模式匹配、monad、模板元編程、並發系統的函數式設計,
以及測試與調試等有關內容,還介紹了使用原有函數創建新函數的知識。
《C++函數式編程》不僅可以作為C++程序員、編程愛好者以及軟件工程師學習函數式編程的參考書,
還可以作為高等院校C++編程語言課的GJ教材

目錄大綱

目錄  
譯者序  
致謝  
前言  
關於本書  
關於作者  
D1章函數式編程簡介  
1.1什麼是函數式編程?  
1.1.1與面向對象編程的關係  
1.1.2命令式與聲明式編程的比較  
1.2純函數(Pure functions)  
1.2.1避免可變狀態  
1.3以函數方式思考問題·  
1.4函數式編程的優點  
1.4.1代碼簡潔易讀  
1.4.2並發和同步  
1.4.3持續優化  
1.5 C++作為函數式編程語言的進化  
1.6將會學到什麼  
總結  
 
D2章函數式編程之旅  
2.1函數使用函數?  
2.2 STL實例  
2.2.1求平均值  
2.2.2折疊(Folding)  
2.2.3刪除字符串空白符  
2.2.4基於謂詞分割集合  
2.2.5過濾(Filtering)和轉換(Transforming)  
2.3 STL算法的可組合性  
2.4編寫自己的高階函數  
2.4.1接收函數作為參數  
2.4.2用循環實現  
2.4.3遞歸(Recursion)和尾調用優化(Tail-call optimization)  
2.4.4使用折疊實現  
總結  
 
D3章函數對象  
3.1函數和函數對象  
3.1.1自動推斷返回值類型  
3.1.2函數指針  
3.1.3調用操作符重載  
3.1.4創建通用函數對象  
3.2 lambda和閉包(Closure)  
3.2.1 lambda語法  
3.2.2 lambda詳解  
3.2.3在lambda中創建任意成員變量  
3.2.4通用lambda表達式  
3.3編寫比lambda更簡潔的函數對象  
3.3.1 STL中的操作符函數對象  
3.3.2其他庫中的操作符函數對象  
3.4用std::function包裝函數對象  
總結  
 
D4章以舊函數創建新函數  
4.1偏函數應用  
4.1.1把二元函數轉換成一元函數的通用方法  
4.1.2使用std::bind綁定值到特定的函數參數  
4.1.3二元函數參數的反轉  
4.1.4對多參數函數使用std::bind  
4.1. 5使用lambda替代std::bind  
4.2柯里化(Currying):看待函數不同的方式  
4.2.1創建柯里化函數的簡單方法  
4.2.2數據庫訪問柯里化  
4.2.3柯里化與偏函數應用  
4.3函數組合  
4.4函數提升(複習)  
4.4.1鍵值對列表反轉  
總結  
 
D5章純潔性:避免可變狀態  
5.1可變狀態帶來的問題  
5.2純函數和引用透明  
5.3無副作用編程  
5.4並發環境中的可變狀態與不可變狀態  
5.5 const的重要性  
5.5.1邏輯const與內部const  
5.5.2對於臨時值優化成員函數  
5.5.3 const的缺陷  
總結  
 
D6章惰性求值  
6.1 C++的惰性  
6.2惰性作為一種優化技術  
6.2.1集合惰性排序  
6.2.2用戶接口中的列表視圖  
6.2.3通過緩存函數結果修剪遞歸樹  
6.2.4動態編程作為惰性形式  
6.3通用記憶化(Generalized memoization)  
6.4表達式模板與惰性字符串拼接  
6.4.1純潔性與表達式模板  
總結  
 
D7章range  
7.1 range簡介  
7.2創建數據的只讀視圖  
7.2.1 range的filter函數  
7.2.2 range的transform函數  
7.2.3 range惰性求值  
7.3修改range中的值  
7.4定界rang和無限range  
7.4.1用定界range優化用於輸入的range  
7.4.2用哨兵創建無限range  
7.5用range統計詞頻  
總結  
 
D8章函數式數據結構  
8.1不可變鍊錶(Immutable linked lists)  
8.1.1在表頭添加和刪除元素  
8.1 .2在鍊錶末尾添加和刪除元素  
8.1.3在鍊錶中間添加和刪除元素  
8.1.4內存管理  
8.2不可變類向量結構  
8.2.1位圖向量樹中的元素查找  
8.2.2向位圖向量樹追加元素  
8.2.3位圖向量樹的修改  
8.2.4在位圖向量樹的末尾刪除元素  
8.2.5其他操作和位圖向量樹的整體效率  
總結  
 
D9章代數數據類型及模式匹配  
9.1代數數據類型  
9.1.1通過繼承實現和類型  
9.1.2通過union和std::variant實現和類型  
9.1.3特定狀態的實現  
9.1.4特殊的和類型:Optional  
9.1.5和類型用於錯誤處理  
9.2使用代數數據類型進行域建模  
9.2.1原始的方法及其缺點  
9.2.2更複雜的方法:自上而下的設計  
9.3使用模式匹配更好地處理代數數據類型  
9.4 Mach7的強大匹配功能  
總結  
 
D10章monad  
10.1仿函數並不是以前的仿函數  
10.1.1處理可選值  
10.2 monad:更強大的仿函數  
10.3基本的例子  
10.4 range與monad的嵌套使用  
10.5錯誤處理  
10.5.1 std::optional

作為monad  
10.5.2 expected  作為monad    
10.5.3 try monad    
10.6 monad狀態處理    
10.7並發和延續monad    
10.7.1 future作為monad    
10.7.2 future的實現    
10.8 monad組合    
總結    
   
D11章模板元編程    
11.1編譯時操作類型    
11.1.1推斷類型調試    
11.1. 2編譯時的模式匹配    
11.1.3提供類型的元信息    
11.2編譯時檢查類型的屬性    
11.3構造科里化函數    
11.3.1調用所有可調用的    
11.4 DSL構建塊    
總結    
   
D12章並發系統的函數式設計    
12.1 Actor模型:組件思想    
12.2創建簡單的消息源    
12.3將反應流建模為monad    
12.3.1創建宿(Sink)接收消息    
12.3.2轉換反應流    
12.3.3創建給定值的流    
12.3.4連接流    
12.4過濾反應流    
12.5反應流的錯誤處理    
12.6響應客戶端    
12.7創建狀態可修改的Actor    
12.8用Actor編寫分佈式系統    
總結    
   
D13章測試與調試    
13.1程序編譯正確嗎?    
13.2單元測試與純函數    
13.3自動產生測試    
顯示全部信息