- 博客(0)
- 资源 (1)
- 收藏
- 关注
real world haskell 中文版epub文件
real world haskell 中文版
第一章:入门
Haskell编程环境
初识解释器ghci
基本交互: 把ghci当作一个计算器
基本算术运算
算术奇事(quirk),负数的表示
布尔逻辑,运算符以及值比较
运算符优先级以及结合性
未定义的变量以及定义变量
处理优先级以及结合性规则
ghci里的命令行编辑
列表(Lists)
列表的操作符
字符串和字符
初识类型
行计数程序
练习
第二章:类型和函数
类型是干什么用的?
Haskell 的类型系统
强类型
静态类型
类型推导
正确理解类型系统
一些常用的基本类型
调用函数
复合数据类型:列表和元组
处理列表和元组的函数
将表达式传给函数
函数类型
纯度
Haskell 源码,以及简单函数的定义
变量
条件求值
通过示例了解求值
惰性求值
一个更复杂的例子
递归
终止递归
从递归中返回
学到了什么?
Haskell 里的多态
对多态函数进行推理
延伸阅读
多参数函数的类型
为什么要对纯度斤斤计较?
回顾
第三章:Defining Types, Streamlining Functions
定义新的数据类型
类型构造器和值构造器的命名
类型别名
代数数据类型
什么情况下该用元组,而什么情况下又该用代数数据类型?
其他语言里类似代数数据类型的东西
模式匹配
组成和解构
更进一步
模式匹配中的变量名命名
通配符模式匹配
穷举匹配模式和通配符
记录语法
参数化类型
递归类型
练习
报告错误
让过程更可控的方法
引入局部变量
屏蔽
where 从句
局部函数与全局变量
The Offside Rule and Whitespace in an Expression
The Case Expression
Common Beginner Mistakes with Patterns
Conditional Evaluation with Guards
Exercises
第四章:函数式编程
使用 Haskell 思考
一个简单的命令行程序
循环的表示
显式递归
对列表元素进行转换
列表映射
筛选列表元素
处理收集器并得出结果
左折叠
为什么使用 fold 、 map 和 filter ?
从右边开始折叠
左折叠、惰性和内存泄漏
延伸阅读
匿名(lambda)函数
部分函数应用和柯里化
节
As-模式
通过组合函数来进行代码复用
编写可读代码的提示
内存泄漏和严格求值
通过 seq 函数避免内存泄漏
seq 的用法
第五章:编写 JSON 库
JSON 简介
在 Haskell 中表示 JSON 数据
Haskell 模块
编译 Haskell 代码
载入模块和生成可执行文件
打印 JSON 数据
类型推导是一把双刃剑
更通用的转换方式
Haskell 开发诀窍
美观打印字符串
数组和对象
书写模块头
完成美观打印库
紧凑转换
真正的美观打印
理解美观打印器
练习
创建包
为包添加描述
GHC 的包管理器
配置,构建和安装
实用链接和扩展阅读
第六章:类型类
类型类的作用
什么是类型类?
定义类型类实例
几个重要的内置类型类
Show
Read
使用 Read 和 Show 进行序列化
数字类型
相等性,有序和对比
自动派生
类型类实战:让 JSON 更好用
让错误信息更有用
使用类型别名创建实例
生活在开放世界
什么时候重叠实例(Overlapping instances)会出问题?
取消类型类的一些限制
字符串的 show 是如何工作的?
如何给类型定义新身份(Identity)
data 和 newtype 的区别
命名类型的三种方式
JSON typeclasses without overlapping instances
可怕的单一同态限定(monomorphism restriction)
结论
第七章:I/O
Haskell经典I/O
Pure vs. I/O
为什么纯不纯很重要?
使用文件和句柄(Handle)
关于 openFile 的更多信息
关闭句柄
Seek and Tell
标准输入,输出和错误
删除和重命名文件
临时文件
扩展例子:函数式I/O和临时文件
惰性I/O
hGetContents
readFile和writeFile
一言以蔽惰性输出
interact
interact 过滤器
The IO Monad
动作(Actions)
串联化
Return的本色
Haskell 实际上是命令式的吗?
惰性I/O的副作用
缓冲区(Buffering)
缓冲区模式
刷新缓冲区
读取命令行参数
环境变量
第八章:高效文件处理、正则表达式、文件名匹配
高效文件处理
二进制 I/O 和有限载入
文本 I/O
匹配文件名
Haskell 中的正则表达式
结果的多种类型
进一步了解正则表达式
不同类型字符串的混合与匹配
你要知道的其他一些事情
将 glob 模式翻译为正则表达式
练习
重要的题外话:编写惰性函数
利用我们的模式匹配器
练习
通过 API 设计进行错误处理
练习
让我们的代码工作
练习
第九章:I/O学习 —— 构建一个用于搜索文件系统的库
find命令
简单的开始:递归遍历目录
再次认识匿名和命名函数
为什么提供 mapM 和 forM
一个本地查找函数
谓词在保持纯粹的同时支持从贫类型到富类型
安全的获得一个文件的大小
请求-使用-释放循环
为谓词而开发的领域特定语言
多用提升(lifting)少用模板
谓词组合
定义并使用新算符
控制遍历
练习
代码深度,可读性和学习过程
观察迭代函数的另一种方法
练习
代码指南
常用布局风格
练习
第十章:代码案例学习:解析二进制数据格式
灰度文件
解析原始 PGM 文件
消除样板代码
隐式状态
identity 解析器
记录语法、更新以及模式匹配
一个更有趣的解析器
获取和修改解析状态
报告解析错误
把解析器串联起来
Functor 简介
给类型定义加约束不好
fmap 的中缀使用
灵活实例
更多关于 Functor 的思考
给 Parse 写一个 Functor 实例
利用 Functor 解析
重构 PGM 解析器
未来方向
练习
第十一章:测试和质量保障
QuickCheck: 基于类型的测试
性质测试
利用模型进行测试
测试案例学习:美观打印器
生成测试数据
测试文档构建
以列表为模型
完成测试框架
用 HPC 衡量测试覆盖率
第十三章:数据结构
关联列表
Map 类型
函数也是数据
扩展示例: /etc/password
扩展示例:数字类型(Numeric Types)
第一步
完整代码
练习
把函数当成数据来用
把差异列表转成库
列表、差异列表和幺半群(monoids)
通用序列
第十八章: Monad变换器
动机: 避免样板代码
简单的Monad变换器实例
Monad和Monad变换器中的模式
叠加多个Monad变换器
缺失的类型参数呢?
隐藏细节
练习
深入Monad栈中
何时需要显式的抬举?
构建以理解Monad变换器
建立Monad变换器
更多的类型类实例
以Monad栈替代Parse类型
练习
注意变换器堆叠顺序
纵观Monad与Monad变换器
对纯代码的干涉
对次序的过度限定
运行时开销
缺乏灵活性的接口
综述
第十九章: 错误处理
使用数据类型进行错误处理
使用Maybe
使用Either
异常
异常第一步
惰性和异常处理
使用handle
选择性地处理异常
I/O异常
抛出异常
动态异常
练习
monad中的错误处理
一个小的解析构架
级习
第二十章:使用 Haskell 进行系统编程
调用外部程序
目录和文件信息
终止程序
日期和时间
ClockTime 和 CalendarTime
文件修改日期
延伸的例子: 管道
使用管道做重定向
更好的管道
关于管道,最后说几句
第二十一章:数据库的使用
HDBC 简介
安装 HDBC 和驱动
连接数据库
事务
简单的查询示例
SqlValue
查询参数
预备语句
读取结果
使用语句进行数据读取操作
惰性读取
数据库元数据
错误处理
第二十二章:扩展示例 —— Web 客户端编程
基本类型
数据库
分析器
下载
主程序
第二七章:Socket 和 Syslog
基本网络
使用 UDP 通信
UDP 客户端例子:syslog
UDP Syslog 服务器
使用 TCP 通信
处理多个 TCP 流
TCP Syslog 服务器
TCP Syslog 客户端
第二十八章:软件事务内存 (STM)
基础知识
一些简单的例子
STM的安全性
重试一个事务
retry 时到底发生了什么?
选择替代方案
在事务中使用高阶代码
I/O 和 STM
线程之间的通讯
并发网络链接检查器
检查一个链接
工作者线程
查找链接
命令行的实现
模式守卫 (Pattern guards)
STM的实践意义
合理的放弃控制权
使用不变量
2018-04-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人