新書推薦:
《
镶嵌之美:古希腊罗马的马赛克艺术
》
售價:NT$
1390.0
《
后希腊化哲学:从斯多亚学派到奥利金的发展研究
》
售價:NT$
349.0
《
别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!)
》
售價:NT$
295.0
《
第二人生:找到重新定义人生的智慧
》
售價:NT$
440.0
《
唐朝三百年
》
售價:NT$
490.0
《
反操纵心理学:夺回人生主导权 拒绝被操纵
》
售價:NT$
249.0
《
同工异曲:跨文化阅读的启示(修订版)(师承钱锺书先生,比较文学入门,体量小但内容丰,案例文笔皆精彩)
》
售價:NT$
199.0
《
牛津立法研究手册
》
售價:NT$
1630.0
編輯推薦:
l 本书用函数式程序设计语言Haskell讲解计算机程序设计,具有抽象层次高,程序语义简洁清晰优美,便于初学者理解程序设计的思想方法。
l 本书内容覆盖计算机程序设计基本知识,特别是函数式程序的特色内容,既有浅显易懂的例题习题,也有比较有趣的程序练习。
l 提供MOOC视频公开课,在线测评练习,便于自学。
內容簡介:
本书用Haskell 语言从函数式程序设计角度讲解计算机程序设计。本书前半部分介绍程序设计的基本内容, 包括数据、类型、函数、递归函数、模块、测试、多态和重载等;后半部分则突出了函数程序设计的特色内容, 包括高阶函数、代数类型、惰性计算和单子等。 全书内容编排由浅入深,语言表达清晰准确,每章都提供了难度适中的练习,各章内容都配备讲解视频, 十分便于自学。 本书是为程序设计初学者编写,可作为高等院校各专业学习程序设计的教材,也可供从事计算机软件工作 的技术人员学习函数式程序设计参考。
目錄 :
第 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
內容試閱 :
学习程序设计,必须选择一种高级程序设计语言。不同于其他介绍程序设计入门的一些书籍,本书选择了Haskell 函数式程序设计语言从函数式程序设计角度介绍程序设计。
高级程序设计语言大致可分为命令式和声明式两种。命令式语言如C、Java 和Python 等,这类语言的程序用语句序列描述如何一步步完成一个计算,其特点是有副作用。例如,对于任意正整数n,计算1~n的和1 2 … n,命令式语言的程序通常形如:
s = 0
for (int i = 1; i <= n; i )
s = s i
这里第一行设置变量s 的初值为0,接下来的循环语句(后两行)不断修改变量s 的值,最后s 的值便是计算结果。这种程序重点描述如何计算。
Haskell 函数式语言属于声明式语言,这种语言的程序用计算逻辑表达计算,不需要描述计算次序,其特点是无副作用。对于前面的求和问题,在Haskell 语言中可以定义数学函数sum:
sum 0 = 0
sum n = n sum (n-1)
在这里,计算1~n之和的Haskell 函数式程序是表达式sum n,sum 是一个纯数学函数,n 是数学意义上的变量,没有副作用。函数式程序重点描述计算什么。
函数式程序设计语言是建立在计算模型演算上的通用高级程序设计语言。由于它具有更高的抽象层次,更接近于人类习惯的数学思维,因此,更便于初学者理解和掌握。
Haskell 函数式程序设计语言具有下列特点。
(1)程序简洁优美,语义清晰,容易理解。例如,对于有一定程序设计基础的程序员,用命令式语言实现快速排序并不容易。然而,下面几行简短的Haskell 代码用列表就表达了快速排序的计算逻辑:
qsort [] = []
qsort (x:xs) = qsort [y|y <- xs, y < x] [x]
qsort [y|y <- xs, y >= x]
这里[] 表示空列表(空序列),(x:xs) 表示非空列表(非空序列),x 是第一个元素,xs 是其余元素构成的列表,[y|y <- xs, y < x] 表示xs 中小于x 的元素构成的列表,[y|y <- xs, y >= x] 表示xs 中大于或等于x 元素构成的列表, 表示将两个列表串接成一个列表的运算。
(2)纯函数无副作用,程序错误更少。命令式程序中的函数多为有副作用的“过程”。一个Haskell 纯函数的计算结果只与函数的输入有关,与计算次序无关,由此避免了命令式程序中由副作用引起的一类错误。
(3)静态强类型,确保类型安全。在Haskell 函数中,将一个输入类型为整数的函数应用于布尔类型是类型错误,这种错误在编译过程中可以检测出来,由此可以避免出现运行时错误。因此,类型正确的函数式程序不会出现运行时错误。
(4)多态和重载支持代码重用。Haskell 的参数多态和重载增强了程序的可重用性。例如,qsort 可用于任何类型的列表,只要这种类型支持小于、大于和等于运算即可。
(5)高阶函数支持更高抽象性,支持模块化。在Haskell 语言中,函数是“一等公民”,函数可以是其他函数的输入和输出,由此为表达更高层次的计算逻辑提供了支持,也为代码重用性和模块化提供了更大的方便。
(6)惰性计算为无穷数据结构提供支持。Haskell 是一种惰性语言,这表明它只有在需要计算时才进行计算,或者只做必要的计算。这种惰性计算允许表达无穷数据结构,由此也为模块化提供了一种新途径。
(7)支持和鼓励形式化验证。Haskell 函数没有副作用,因此,可以像对数学表达式那样对程序进行推理,也可以使用形式化工具验证其正确性,确保程序的正确性。
本书内容涵盖函数式程序设计入门的基本知识。第1章简要介绍程序设计的概念;第2章介绍Haskell 函数式程序设计的基本知识,包括数据、类型、函数、递归函数、模块和测试等基本知识;第3章进一步介绍列表程序设计,包括如何设计一个字符图形库;第4章介绍程序设计的多态和重载概念,以及Haskell 处理重载的类族机制;第5章介绍函数式程序设计的重要特性:高阶函数,包括常用的map、foldr 和filter 等;第6章介绍如何自定义类型以更准确地表达数据;第7章介绍如何设计交互程序,包括模拟计算和小游戏;第8章介绍Haskell 语言的惰性计算策略以及惰性计算对模块划分的支持,特别是生产者-消费者模式;第9章介绍函数式语言的高级特性函子与单子,包括一个单子语法分析器和一个简单计算器的实现。
函数式程序设计语言(也简称为函数程序设计语言)(①虽然不是主流程序设计语言,但是函数程序设计的概念如表达式、函数对象、map、filter 和reduce 等高阶函数已经渗透到各种主流程序设计语言如C 、Java 和Python 中。因此,从函数式程序设计语言入门学习程序设计,无论对初学者还是有基础的程序员,都将开启一扇新的程序设计科学的大门。
与其他函数式程序设计书籍相比,本书具有下列特点。
(1)适合初学程序设计的读者。
(2)内容简练,由浅入深,适合自学。
(3)本书是立体式教材,与中国大学慕课“Haskell 函数程序设计基础”配套。
本书能以现在的面貌出版,得益于许多老师和学生的支持。特别感谢裘宗燕教授、宋方敏教授和罗朝晖教授三位专家在百忙之中阅读本书初稿,并提出了许多中肯的意见!限于作者的水平,本书现在的面貌恐未能达到专家期望的水平,在此作者深表歉意!本书在编写过程中得到了清华大学出版社白立军老师和杨帆老师的大力协助,在此一并表示感谢!
本书可作为大中专院校非计算机专业程序设计入门教材,也可作为其他程序设计爱好者的自学教材。
限于作者的水平,书中可能有错误和疏漏,敬请读者不吝指正。
作者
2022 年春于中山大学东校园
( ① 本书将把“函数式程序设计”简称为“函数程序设计”,“函数式程序”简称为“函数程序”。