內容簡介

函數式編程(FP)是一種軟件開發風格,它注重不依賴於編程狀態的函數。函數式代碼易於測試和復用,容易實現並發,且不容易受到bug的攻擊。Scala是一種能很好支持函數式編程的新興JVM語言。

本書是針對希望學習FP並將它應用於日常編碼中的程序員而寫的,包括:函數式編程的概念;函數式編程相關的各種”為什麼」和”怎麼做」;如何編寫多核程序;練習和檢測。
 

目錄

原推薦序
序言
致謝
關於本書
第一部分函數式編程介紹
1什麼是函數式編程
1.1函數式編程的好處:一個簡單的例子
1.1.1一段帶有副作用的程序
1.1.2函數式的解法:去除副作用
1.2(純)函數究竟是什麼
1.3引用透明、純粹度以及替代模型
1.4小結
2在Scala中使用函數式編程
2.1Scala語言介紹:
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.3Option數據類型
4.3.1Option的使用模式
4.3.2Option的組合、提升及對面向異常的API的包裝
4.4Either數據類型
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.4API與代數
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.1API的初始代碼片段
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.1JSON格式
9.4.2JSON分析器
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小結
11Monad
11.1函子:對map函數的泛化
11.1.1函子法則
11.2Monad:對flatMap和unit函數的泛化
11.3Monadic組合子
11.4單子定律
11.4.1結合法則
11.4.2為指定的monad證明結合法則
11.4.3單位元法則
11.5什麼是monad
11.5.1identity monad
11.5.2狀態monad和partial type application
11.6小結
12可應用和可遍歷函子
12.1泛化單子
12.2Applicative 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.1Left and right identity
12.5.2結合律
12.5.3Naturality 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.6Monad組合
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.2Trampolining:棧溢出的通用解決方法
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.6Effectful通道
15.3.7動態資源分配
15.4應用場景
15.5小結
網路書店 類別 折扣 價格
  1. 新書
    $414