原推薦序
序言
緻謝
關於本書
函數式編程介紹
1什麼是函數式編程
1.1 函數式編程的好處:一個簡單的例子
1.1.1 一段帶有副作用的程序
1.1.2 函數式的解法:去除副作用
1.2 (純)函數究竟是什麼
1.3 引用透明、純粹度以及替代模型
1.4 小結
2在Scala中使用函數式編程
2.1 Scala語言介紹:
2.2 運行程序
2.3 模塊、對象和命名空間
2.4 高階函數:把函數傳給函數
2.4.1 迂迴做法:使用循環方式
2.4.2 第一個高階函數
2.5 多態函數:基於類型的抽象
2.5.1 一個多態函數的例子
2.5.2 對高階函數傳入匿名函數
2.6 通過類型來實現多態
2.7 小結
3函數式數據結構
3.1 定義函數式數據結構
3.2 模式匹配
3.3 函數式數據結構中的數據共享
3.3.1 數據共享的效率
3.3.2 改進高階函數的類型推導
3.4 基於list的遞歸並泛化為高階函數
3.4.1 更多與列錶相關的函數
3.4.2 用簡單組件組閤list函數時的效率損失
3.5 樹
3.6 小結
4不是用異常來處理錯誤
4.1 異常的優點與劣勢
4.2 異常的其他選擇
4.3 Option數據類型
4.3.1 Option的使用模式
4.3.2 Option的組閤、提升及對麵嚮異常的API的包裝
4.4 Either數據類型
4.5 小結
5嚴格求值和惰性求值
5.1 嚴格和非嚴格函數
5.2 一個擴展例子:惰性列錶
5.2.1 對Stream保持記憶,避免重復運算
5.2.2 用於檢測Stream的helper函數
5.3 把函數的描述與求值分離
5.4 無限流與共遞歸
5.5 小結
6純函數式狀態
6.1 以副作用方式生成隨機數
6.2 純函數式隨機數生成器
6.3 用純函數式實現帶狀態的API
6.4 狀態行為的更好的API
6.4.1 組閤狀態行為
6.4.2 嵌套狀態行為
6.5 更通用的狀態行為數據類型
6.6 純函數式命令編程
6.7 小結
功能設計和組閤子庫
7純函數式的並行計算
7.1 選擇數據類型和函數
7.1.1 一種用於並行計算的數據類型
7.1.2 組閤並行計算
7.1.3 顯性分流
7.2 確定錶現形式
7.3 完善API
7.4 API與代數
7.4.1 映射法則
7.4.2 分流法則
7.4.3 打破法則:一個微妙的bug
7.4.4 用Actor實現一個完全無阻塞的Par
7.5 完善組閤子為更通用的形式
7.6 小結
8基於性質的測試
8.1 基於性質測試概覽
8.2 選擇數據類型和函數
8.2.1 API的初始代碼片段
8.2.2 性質的含義與API
8.2.3 生成器的意義和API
8.2.4 生成值決定生成器
8.2.5 精煉Prop的數據類型
8.3 最小化測試用例
8.4 使用庫並改進其易用性
8.4.1 一些簡單的例子
8.4.2 為並行計算編寫測試套件
8.5 測試高階函數及展望未來
8.6 生成器法則
8.7 小結
9語法分析器組閤子
9.1 代數設計,走起
9.2 一種可能的代數
9.2.1 切片和非空重復
9.3 處理上下文的相關性
9.4 寫一個JSON分析器
9.4.1 JSON格式
9.4.2 JSON分析器
9.5 錯誤提示
9.5.1 一種可行的設計
9.5.2 錯誤嵌套
9.5.3 控製分支和迴溯軌跡
9.6 實現代數
9.6.1 一種可能的實現
9.6.2 串化分析器
9.6.3 標記分析器
9.6.4 故障轉移和迴溯
9.6.5 上下文相關的分析
9.7 小結
函數設計的通用結構
10Monoid
10.1 什麼是monoid
10.2 使用monoid摺疊列錶
10.3 結閤律和並行化
10.4 例子:並行解析
10.5 可摺疊數據結構
10.6 組閤monoid
10.6.1 組裝更加復雜的monoid
10.6.2 使用組閤的monoid融閤多個遍曆
10.7 小結 151
11Monad
11.1 函子:對map函數的泛化
11.1.1 函子法則
11.2 Monad:對flatMap和unit函數的泛化
11.3 Monadic組閤子
11.4 單子定律
11.4.1 結閤法則
11.4.2 為指定的monad證明結閤法則
11.4.3 單位元法則
11.5 什麼是monad
11.5.1 identity monad
11.5.2 狀態monad和partial type application
11.6 小結
12可應用和可遍曆函子
12.1 泛化單子
12.2 Applicative trait
12.3 單子與可應用函子的區彆
12.3.1 對比Option applicative與Option monad
12.3.2 對比Parser applicative與Parser monad
12.4 可應用函子的優勢
12.4.1 不是所有的可應用函子都是Monad
12.5 可應用法則
12.5.1 Left and right identity
12.5.2 結閤律
12.5.3 Naturality of product
12.6 可遍曆函子
12.7 使用Traverse
12.7.1 從monoid到可應用函子
12.7.2 帶狀態的遍曆
12.7.3 組閤可遍曆結構
12.7.4 遍曆融閤
12.7.5 嵌套遍曆
12.7.6 Monad組閤
12.8 小結
作用與I/O
13外部作用和I/O
13.1 分解作用13.2 一個簡單的IO類型
13.2.1 處理輸入效果
13.2.2 簡單IO類型的優缺點
13.3 避免棧溢齣
13.3.1 將一個控製流轉化為數據構造子
13.3.2 Trampolining:棧溢齣的通用解決方法
13.4 一個更微妙的IO類型
13.4.1 閤理的monad
13.4.2 一個支持控製颱I/O的monad
13.4.3 純解釋器
13.5 非阻塞和異步I/O
13.6 一個通用的IO類型
13.6.1 最終的main程序
13.7 為什麼IO類型不足以支撐流式I/O
13.8 小結
14本地影響和可變狀態
14.1 純函數式的可變狀態
14.2 一種限製副作用範圍的數據類型
14.2.1 受限可變性的語言錶達
14.2.2 一種可變引用的代數錶達
14.2.3 執行修改狀態的行為
14.2.4 可變數組
14.2.5 一個純函數的in-place快排實現
14.3 純粹是相對於上下文的
14.3.1 副作用是什麼?
14.4 小結
15流式處理與增量I/O
15.1 命令式I/O的問題示例
15.2 一個簡單的流轉換器
15.2.1 創建Process
15.2.2 組閤和追加處理
15.2.3 處理文件
15.3 可擴展的處理類型
15.3.1 來源
15.3.2 保證資源安全
15.3.3 單一輸入過程
15.3.4 多個輸入流
15.3.5 去嚮
15.3.6 Effectful通道
15.3.7 動態資源分配
15.4 應用場景
15.5 小結
· · · · · · (
收起)