目  录
第 1 章  计算机程序设计 	1 
1.1  命令式程序设计 	1 
1.1.1  程序设计的概念 	1 
1.1.2  命令式算法和伪代码	2 
1.1.3  命令式程序 	3 
1.2  函数程序设计 	4 
1.2.1  程序是函数 	4 
1.2.2  Haskell 函数程序 	5 
1.2.3  Haskell 函数语言的特点	5 
1.3  Haskell 解释器和编译器 	6 
1.3.1  下载 Haskell 解释器和编译器	7 
1.3.2  运行 Haskell 程序	8 
1.3.3  解释器常用命令	10 
1.4  习题 	10 
第 2 章  函数程序设计基础 	12 
2.1  程序与函数	12 
2.1.1  数学函数	13 
2.1.2  Haskell 函数	14 
2.2  数据和类型	15 
2.2.1  数据类型 	15 
2.2.2  数值类型 	15 
2.2.3  布尔类型 	17 
2.2.4  查看表达式的类型 	18 
2.2.5  字符和字符串	19 
2.2.6  列表类型  	19 
2.2.7  多元组类型 	21 
2.2.8  多元组类型和列表类型的对比	22
2.2.9  函数类型 	23 
2.2.10  函数应用与类型推导规则	23 
2.3  Haskell 函数定义	24 
2.3.1  函数定义语法规则	24 
2.3.2  函数定义举例 	26 
2.4  递归函数	31 
2.4.1  阶乘函数 	31 
2.4.2  斐波那契数列 	32 
2.4.3  汉诺塔	33 
2.5  模块	35 
2.5.1  模块的定义	35 
2.5.2  模块的使用	35 
2.5.3  查找库函数	37 
2.6  软件调试与测试	38 
2.6.1  软件调试 	38 
2.6.2  软件测试 	40 
2.6.3  程序的规格说明 	40 
2.6.4  QuickCheck 随机测试工具	41 
2.7  习题	43 
第 3 章  列表程序设计	47 
3.1  列表的构造 	47 
3.1.1  构造函数 	47 
3.1.2  列表概括 	50 
3.2  图书借阅管理 	52 
3.2.1  借阅卡的数据及其类型 	53 
3.2.2  图书查询 	53 
3.2.3  借阅管理 	54 
3.3  超市购物清单 	55 
3.3.1  数据类型的设计 	55 
3.3.2  屏幕打印函数 	56 
3.3.3  打印清单函数 	57 
3.4  一个简单图形库	58 
3.4.1  图形的类型	59 
3.4.2  图形的显示	60 
3.4.3  图形上的运算	60 
3.4.4  图形模块及其应用	64
3.5  习题	65 
第 4 章  多态与重载	68 
4.1  多态函数 	68 
4.1.1  单态与多态	68 
4.1.2  多态函数举例 	70 
4.2  重载	71 
4.2.1  类族和重载	71 
4.2.2  常用的已定义类族	73 
4.2.3  重载函数举例  	76 
4.3  习题	79 
第 5 章  高阶函数	81 
5.1  函数也是数据 	81 
5.1.1  map 计算模式  	81 
5.1.2  λ 表达式 	82 
5.2  常用高阶函数 	84 
5.2.1  折叠计算模式 foldr	84 
5.2.2  过滤计算模式 filter	85 
5.2.3  前缀处理函数 takeWhile 和 dropWhile	85 
5.2.4  函数的复合	86 
5.2.5  卡瑞化  	88 
5.2.6  部分应用 	89 
5.3  词频统计 	89 
5.3.1  问题分析及解决步骤 	89 
5.3.2  设计分步函数	90 
5.3.3  步骤的复合	91 
5.4  习题	92 
第 6 章  代数类型	95 
6.1  自定义类型  	95 
6.1.1  简单有穷类型  	95 
6.1.2  定义新类型为类族的实例	96 
6.1.3  无穷类型 	98 
6.2  数据类型的归纳定义	100 
6.2.1  自定义自然数类型	100 
6.2.2  一个表达式类型 	101
6.3  带类型参数的自定义类型 	103 
6.3.1  列表类型的定义 	103 
6.3.2  Maybe 类型 	104 
6.4  习题	106 
第 7 章  IO 程序 	111 
7.1  IO 类型 	111 
7.1.1  IO 类型的基本操作 	111 
7.1.2  连续动作的表示和 do 语法 	113 
7.1.3  使用递归实现动作的重复性	115 
7.2  模拟计算 	116 
7.2.1  随机数与猜数游戏	116 
7.2.2  随机事件的模拟 	119 
7.2.3  识别计算模式  	121 
7.2.4  用蒙特卡洛方法估算 π 的近似值 	123 
7.2.5  一个简单猜拳游戏	125 
7.3  文件读写与数据处理	129 
7.3.1  文件读写	129 
7.3.2  数据处理	130 
7.4  习题 	133 
第 8 章  惰性计算 	134 
8.1  惰性计算概述 	134 
8.1.1  惰性与严格 	134 
8.1.2  计算规则	135 
8.1.3  局部定义	136 
8.2  无穷数据结构 	137 
8.2.1  斐波那契数列 	 137 
8.2.2  埃拉托色尼筛法	 137 
8.2.3  牛顿-拉森迭代法	138 
8.3  习题  	140 
第 9 章  函子与单子	141 
9.1  类型构造函数及其种	141 
9.2  函子	142 
9.2.1  Functor 类族 	143 
9.2.2  Functor 的实例 	143
9.2.3  函子定律	144 
9.3  Applicative 类族  	146 
9.3.1  Applicative 类族及其实例  	146 
9.3.2  Applicative 定律	148 
9.4  单子	149 
9.4.1  单子定义和实例 	149 
9.4.2  单子的 do 语法 	150 
9.4.3  单子定律	151 
9.4.4  单子解释器  	152 
9.5  单子语法分析器	153 
9.5.1  算术表达式定义 	154 
9.5.2  语法分析器  	154 
9.5.3  基本语法分析器 	155 
9.5.4  算术表达式计算器	158 
9.6  习题  	159 
附录 A  GHC 的安装	161 
A.1  使用 GHCup 工具安装	161 
A.2  其他安装方法	161 
附录 B 部分 Prelude 函数	163 
参考文献	168 
索引	169