第一部分 基础知识 3
第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
第二部分 重要的类型和类型类 107
第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
第三部分 高级类型类和项目实践 211
第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