第1章 函数式程序设计简介 1
1.1计算机与建模 1
1.2什么是函数 2
1.3图形与函数 3
1.4类型 4
1.5函数式程序设计语言Haskell 6
1.6表达式与计算 7
1.7定义 8
1.8函数定义 10
1.9类型与函数式程序设计 12
1.10计算与求值 13
1.11函数式程序设计的精髓 14
1.12领域专用语言 15
1.13图形的两种模型 16
1.14测试、性质和证明 19
第2章 认识Haskell与GHCi 24
2.1第一个Haskell程序 24
2.2在工作中使用Haskell 25
2.3使用GHCi 26
2.4标准库Prelude和Haskell函数库 30
2.5模块 30
2.6例子:Pictures 31
2.7错误与错误信息 34
第3章 基本类型与定义 37
3.1布尔类型Bool 37
3.2整数类型:Integer和Int 40
3.3重载 43
3.4守卫 43
3.5字符和串 47
3.6浮点数Float 50
3.7语法 53
第4章 设计与书写程序 60
4.1如何开始一个Haskell程序的设计 60
4.2逐步求解问题:局部定义 64
4.3自定义类型:枚举类型 70
44递归 72
4.5实践中的原始递归 76
4.6扩展练习:图形 78
4.7递归的一般形式 81
4.8程序测试 83
第5章 数据类型、多元组与列表 88
5.1多元组和列表简介 88
5.2元组类型 90
5.3代数类型简介 93
5.4本书对列表的介绍方法 98
5.5 Haskell的列表 99
5.6列表概括 101
5.7图书馆数据库 104
第6章 列表程序设计 110
6.1通用函数:多态 110
6.2 Haskell引导库Prelude中的列表函数 112
6.3认识Haskell函数库 115
6.4 Picture例子的实现 119
6.5扩展练习:图形的另一种实现 124
6.6扩展练习:有位置的图形 127
6.7扩展练习:超市账单 130
6.8扩展练习:纸牌和纸牌游戏 134
第7章 定义列表上的函数 137
7.1再谈模式匹配 137
7.2列表与列表模式 138
7.3列表上的原始递归 141
7.4寻找原始递归定义 143
7.5列表上的一般递归 147
7.6例子:文本处理 150
第8章 游戏:Haskell的1/O 156
8.1石头-剪刀-布的策略 156
8.2为什么1/O是一个问题 159
8.3输入/输出 160
8.4 do语法 163
8.5迭代与递归 166
8.6石头-剪刀-布:玩游戏 169
第9章 程序推理 173
9.1理解定义 173
9.2测试与证明 175
9.3定义性、终止性和有限性 176
9.4一些逻辑知识 177
9.5归纳法 178
9.6归纳证明的进一步例子 181
9.7推广证明目标 186
第10章 推广:计算模型 190
10.1列表上的计算模式 190
10.2高阶函数:函数作为参数 193
10.3折叠与原始递归 197
10.4推广:拆分列表 201
10.5再谈实例 202
第11章 高阶函数 205
11.1运算:函数的复合和应用 205
11.2函数的表达式:λ抽象 209
11.3部分应用 211
11.4卡瑞式函数 215
11.5定义高阶函数 219
11.6验证与通用函数 223
第12章 高级程序开发 233
12.1再谈Picture 233
12.2函数作为数据:策略组合子 236
12.3函数作为数据:正则表达式匹配 238
12.4函数作为数据的实例 241
12.5例子:建立索引 243
12.6实践中的程序开发 248
12.7理解程序 251
第13章 重载,类族和类型检测 254
13.1为什么使用重载? 254
13.2引进类族 255
13.3签名和实例 258
13.4 Haskell的预定义类族 265
13.5类型检测和类型推导概述 273
13.6单态类型检测 274
13.7多态类型检测 277
13.8类型检测与类族 284
第14章 代数类型 287
14.1代数类型回顾 288
14.2递归代数类型 289
14.3多态代数类型 296
14.4程序错误的表示 299
14.5使用代数类型设计系统 303
14.6代数类型与类族 308
14.7代数类型的推理 313
第15章 实例研究:Huffman编码 319
15.1 Haskell的模块 319
15.2模块设计 323
15.3编码与译码 324
15.4实现一 326
15.5构造Huffman树 328
15.6设计 329
15.7实现二 330
第16章 抽象数据类型 338
16.1类型表示 338
16.2 Haskell抽象数据类型机制 339
16.3队列 343
16.4设计 347
16.5仿真 348
16.6实现仿真 350
16.7查找树 354
16.8集合 360
16.9关系和图 366
16.10评注 374
第17章 惰性计算 376
17.1惰性计算 376
17.2计算规则与惰性计算 378
17.3再谈列表概括 382
17.4数据导向编程 389
17.5实例:分析表达式 392
17.6无穷列表 402
17.7为什么使用无穷列表 407
17.8实例:仿真 410
17.9再谈证明 412
第18章 单子程序设计 419
18.1输入/输出程序 419
18.2深入I/O 422
18.3计算器 425
18.4再谈do记法 428
18.5单子:为函数式程序设计定制的语言 429
18.6例子:树上的单子式计算 435
第19章 领域专用语言 442
19.1程序语言无处不在 442
19.2为什么在Haskell中嵌入DSL ? 445
19.3浅嵌入和深嵌入 446
19.4处理正则表达式的DSL 449
19.5单子式DSL 453
19.6表示计算的DSL:QuickCheck中的数据生成 456
19.7深入DSL 461
第20章 时间与空间行为 463
20.1函数的复杂度 463
20.2计算的复杂度 467
20.3集合的实现 471
20.4空间行为 472
20.5再谈折叠 475
20.6避免重复计算:记忆 481
第21章 结论 487
21.1函数式程序设计的威力 487
21.2深入Haskell 488
21.3网络上的Haskell 489
21.4其他函数式程序设计语言 490
附录A 函数式,命令式和OO程序设计 492
A.1值与状态 492
A.2函数与变量 493
A.3程序验证 493
A.4记录和元组 494
A.5列表和指针 495
A.6高阶函数 497
A.7多态 497
A.8定义类型与类族 498
A.9列表概括 498
A.10惰性计算 499
A.11状态,无穷列表和单子 499
A.12结论 499
附录B 术语解释 501
附录C Haskell运算符 509
附录D Haskell实践 511
D.1实现 511
D.2下载Craft3e代码 511
D.3使用GHCi 511
D.4 Haskell编辑器 511
附录E GHCi错误 513
E.1语法错误 513
E.2类型错误 515
E.3程序错误 517
E.4模块错误 517
E.5系统信息 517
附录F 项目建设 519
F.1游戏与智力测验 519
F.2 Web图形 520
F.3逻辑 520
F.4投票系统 521
F.5有穷自动机 522
F.6领域专用语言 522
参考文献 523
索引 526