魔力Haskell
內容描述
本書是一本由淺入深的Haskell教程。書中首先介紹Haskell的基礎語法和函數式編程的基本概念,以及GHC、GHCi、Cabal等工具的用法;接著按照函子→應用函子→單子的順序介紹Haskell中核心的三大類型類,並以列表單子、Reader單子和State單子為例詳細分析單子類型類的來龍去脈;後介紹Foldable和Traversable類型類、單子變換、GHC的語言擴展和程序標註,以及網絡編程、數據庫、並發並行、序列化/反序列化與泛型編程、異常處理等內容。
目錄大綱
第一部分基礎知識
第1章基本語法和GHCi 3
1.1註釋3
1.2表達式3
1.3聲明4
1.3.1類型聲明和綁定聲明4
1.3.2模塊聲明和導入聲明5
1.4函數6
1.5 GHCi 8
1.6初級函數10
第2章data和模式匹配13
2.1數據聲明data 13
2.2模式匹配14
2.2.1無處不在的模式匹配15
2.2.2 @pattern 16
2.3各式各樣的數據類型16
2.3.1多構造函數16
2.3.2完備性檢查17
2.3.3無參數構造函數18
2.3.4 data與類型變量18
2.3.5記錄語法20
2.4排版規則22
第3章列表、遞歸和盒子比喻23
3.1列表23
3.1.1等差數列24
3.1.2匹配列表24
3.2遞歸操作26
3.3盒子比喻30
第4章元組、類型推斷和高階函數34
4.1元組34
4.2類型推斷35
4.3高階函數37
4.3.1拉鍊和zipWith 39
4.3.2柯里化41
第5章常用的高階函數和函數的補充
語法43
5.1應用函數$和& 43
5.2匿名函數44
5.3組合函數. 45
5.4函數的補充語法46
5.4.1 where 46
5.4.2 guard 47
5.4.3 MultiWayIf 49
5.4.4 where與let 49
5.5 Point free 49
5.6黑魔法詞彙表51
第6章常用的列表操作:映射、過濾、
折疊和掃描53
6.1映射53
6.2過濾54
6.3折疊55
6.4掃描57
6.5方向是相對的60
第7章類型類62
7.1實例聲明62
7.2類聲明65
7.3類型類的實現66
7.3 .1層級和約束67
7.3.2推導類型類68
7.3.3 Show/Read 69
第8章數字相關的類型類71
8.1順序類71
8.2 data和類型約束72
8.3枚舉類73
8.4邊界類75
8.5數字類76
第9章type、newtype和惰性求值80
9.1類型別名type 80
9.2新類型聲明newtype 81
9.3惰性求值84
9.3.1標記語義、常態和弱常態87
9.3.2 seq和deepseq 90
第10章模塊語法以及cabal、Haddock
工具94
10.1模塊語法94
10.2使用cabal 96
10.2.1使用cabal安裝依賴96
10.2.2項目的cabal配置98
10.3 Haddock 101
第二部分重要的類型和類型類
第11章函子107
11.1容器抽象107
11.2範疇110
11.3 Identity和Const 115
11.4 IO函子117
第12章透鏡組118
12.1 getter和setter 118
12.2透鏡組120
12.3 view、set和over函數122
12.3.1 over函數122
12.3.2 set函數124
12.3.3 view函數125
12.4函數庫128
第13章應用函子129
13.1函子的局限129
13.2什麼是函子133
13.2.1 Reader應用函子134
13.2.2自然升格135
13.3 IO應用函子138
第14章單位半群和一些有趣的應用
函子139
14.1單位半群139
14.1.1 Endo單位半群141
14.1.2自由單位半群142
14.1.3逆144
14.2當單位半群遇上應用函子145
14.2.1 Const a的應用函子實例145
14.2.2選擇應用函子146
14.2.3拉鍊應用函子147
第15章解析器149
15.1參數解析149
15.2 optparse-applicative 151
15.3選擇解析153
第16章單子158
16.1應用函子的局限158
16.2什麼是單子159
16.2.1粘合函數161
16.2.2 do語法糖163
16.3 IO單子165
第17章八皇后問題和列表單子168
17.1列表單子與數組歸納168
17.2八皇后問題169
17.3 MonadPlus 171
17.4結構控制函數173
17.4.1 sequence/sequence 173
17.4.2 mapM/mapM 174
17.4.3 replicateM/replicateM 175
17.4.4 forever 176
17.4.5 filterM 176
17.4.6 foldM/foldM 177
第18章Reader單子179
18.1 (->)a的單子實例聲明179
18.2模板渲染180
18.3 Reader新類型185
第19章State單子187
19.1什麼是State單子187
19.2隨機數192
19.3簡易計算器195
第20章IO和它的伙伴們197
20.1 IO單子的本質197
20.2基本IO操作199
20.3 IO中的變量202
20.4 forkIO 203
20.5 ST單子204
20.6後門函數206
第三部分高級類型類和項目實踐
第21章語言擴展和程序標註211
21.1語言擴展211
21.2嚴格求值數據項214
21.3惰性模式214
21.4程序標註215
21.5編譯選項217
21.6運行分析218
第22章Foldable和Traversable 221
22.1 Foldable 221
22.2折疊與單位半群224
22.3 Traversable 226
22.4推導規則230
22.5 Data.Coerce 231
第23章列表、數組和散列表233
23.1列表233
23.2數組236
23.3散列表242
第24章單子變換245
24.1 Kleisli範疇245
24.2 ReaderT 246
24.3 Identity和IdentityT 248
24.4 StateT 250
24.5 RandT 253
第25章單子變換的升格操作256
25.1 MonadIO 258
25.2 MonadState和MonadReader 258
25.3類型家族260
25.4 Lazy StateT和Strict StateT 262
25.5 Writer單子263
第26章高效字符串處理266
26.1 bytestring函數庫266
26.1.1 Lazy ByteString 267
26.1.2 ByteString Builder 268
26.2 text和utf8-string函數庫272
26.3 mono-traversable函數庫274
第27章網絡編程276
27.1 wai/warp 276
27.2 wai-extra 279
27.3 http的單子抽象280
27.4 WebSocket編程281
27.5 Socket編程283
第28章Haskell與數據庫286
28.1 persistent 286
28.2 esqueleto 292
第29章模板編程296
29.1什麼是模板296
29.2 Q單子299
29.3拼接301
29.4 reify 303
第30章並發和並行編程306
30.1運行時工作原理306
30.2並行編程308
30.3並發編程310
30.3.1 MVar 311
30.3.2 STM 314
30.3.3 aysnc 316
第31章高級類型編程317
31.1 Typeable和Dynamic 317
31.2存在類型320
31.3類型家族、數據家族和GADT 321
31.3.1類型家族321
31.3.2數據家族324
31.3.3 GADT 325
31.4數據類別DataKinds 327
第32章序列化/反序列化與泛型編程331
32.1 aeson函數庫331
32.1.1使用模板編程自動生成ToJSON/FromJSON實例334
32.1.2使用泛型提供的ToJSON/FromJSON 335
32.2泛型336
第33章Haskell中的異常處理342
33.1使用Either/Maybe表示異常342
33.2運行時異常343
33.2.1異步異常346
33.2.2資源的清理和釋放348
33.3純函數中的異常處理349
33.4異常和單子變換350
33.4.1 exceptions 350
33.4.2 monad-control 351
33.5 常見的異常處理問題353
作者介紹
韓冬,北京理工大學07級畢業生,畢業後從事嵌入式開發,後投身互聯網行業,曾任職百度、美團網高級前端工程師,現在在滴滴出行平台架構組從事架構開發工作。在工作中實踐函數式編程,經驗豐富。