感谢林晴、史珩、shahito、乐乐Joker 以及其他匿名用户的反馈,勘误表如下(另外,原书作者另写了一本伴生书,对文章的错别字以及个别代码样例错误做了纠正,伴生书pdf可从作者网站免费下载:http://blog.higher-order.com/assets/fpiscompanion.pdf 为了保持一致,伴生书中修订的内容在中文版中并没有修改。伴生书中指出的错误并不多,也不影响本书阅读,主要是为书中的练习做解释)
页数:目录
原文:1.3 引用透明、纯粹度以及替代模型
修改:1.3 引用透明、纯粹性以及代换模型
页数:目录 XI
原文:4 不是用异常来处理错误
修改:4 不使用异常来处理错误
页数:目录 XII
原文:第二部分 功能设计和组合子库
修改:第二部分 函数式设计和组合子库
原文:9.1 代数设计,走起
修改:9.1 代数设计
页数:目录 XIII
原文:第三部分 函数设计的通用结构
修改:第三部分 函数式设计的通用结构
页数:目录 XV
原文:14 本地影响和可变状态
修改:14 局部作用和可变状态
原文:14.3 纯粹是相对于上下文的
修改:14.3 纯粹性是相对于上下文的
页数:原推荐序
第一段中
原文:函数式编程作为书题出现在Scala中是个有趣的现象。
修改:《Scala函数式编程》是个有趣的书名。
第二段中
原文:它同时承认非纯粹函数和纯函数
修改:它同时允许非纯粹函数和纯函数
第五段中
原文:从第一个原理扩展到
修改:从首要原则扩展到
页数:第一部分 函数式编程介绍
第一段中
原文:我们以一个激进的前提开始读这本书
修改:我们以一种激进的前提开始这本书
原文:比如读取文件或修改内存时。
修改:比如读取文件或修改内存。
第二段中
原文:并给你一些有益的理念。
修改:让你对函数式编程的好处有些概念。
页数:8
原文:引用透明与纯粹度
修改:引用透明与纯粹性
原文:1.3 引用透明、纯粹度以及替代模型
修改:1.3 引用透明、纯粹性以及代换模型
// 统一翻译为“代换模型”
原文:我们称之为代替模型( substitution model )。
修改:我们称之为代换模型( substitution model )。
原文:其中一个例子的所有表达式都是引用透明的,可用替代模型来推导,
修改:其中一个例子的所有表达式都是引用透明的,可用代换模型来推导,
原文:让我们尝试在Scala解析器(也称作REPL,
修改:让我们尝试在Scala解释器(也称作REPL,
页数:10
原文:与之相反的是,替换模型则很容易推理
修改:与之相反的是,代换模型则很容易推理
原文:即使没有用过“替代模型”这一名词,
修改:即使没有用过“代换模型”这一名词,
原文:还对引用透明和代替模型进行了讨论,
修改:还对引用透明和代换模型进行了讨论,
页数:22
// andThan -> andThen
原文:同时还提供了一个 andThan 方法, f andThan g 等价于 g compose f
修改:同时还提供了一个 andThen 方法, f andThen g 等价于 g compose f
页数:23
原文:对于像这样小的一行层序,还不算困难
修改:对于像这样的一行小程序,还不算困难
页数:40
原文:不是用异常来处理错误
修改:不使用异常来处理错误
页数:41
原文:让替代模型的简单推导无法适用
修改:让代换模型的简单推导无法适用
页数:57
原文:如果表达式 f(x) 对所有的evaluates to bottom的表达是x,也是evaluates to bottom,那么f是严格求值的。
修改:如果表达式f(x)对于所有evaluates to bottom的表达式x同样是evaluates to bottom的,那么f是严格求值的。
页数:67
原文:目的是模拟投6面色子死亡法
修改:目的是模拟投6面体骰子
页数:73
原文:这是向右移的方式,
修改:这是朝着正确方向前进,
原文:用纯函数式API实现一个更加可测的死亡色子?
修改:用纯函数式API实现一个更加可测的投骰子?
原文:这里是一个死亡色子 rollDie 的实现,
修改:这里是一个投骰子 rollDie 的实现,
页数:77
原文:第二部分 功能设计和组合子库
修改:第二部分 函数式设计和组合子库
页数:81
原文:两边的表达式是无法实现平行执行的。
修改:两边的表达式是无法实现并行执行的。
注释2
原文:并在衍生下一个并行计算之前等待前一个并行计算完成,这样的计算比较高效同时也保证串行执行。
修改:并在衍生下一个并行计算之前等待前一个并行计算完成,这样的计算实际是串行的。
页数:90
原文:(法则常常是从标识的具体例子中得出来的)
修改:(法则常常是从恒等式的具体例子中得出来的)
注释8
原文:这里的标识我们想表达的是,在数学上指两个表达式相同或等价
修改:这里的恒等式表达的是,在数学上指两个表达式相同或等价
页数:91
//将 fascinating 翻译为了“醉了吧” 与整本书的语言风格不一致,删除。
原文:醉了吧!从最后的法则可以看出对于map而言unit明显是个多余的细节。
修改:从最后的法则可以看出对于map而言unit明显是个多余的细节。
原文:由于我们得到的这个第二法则或定理是自由的,仅仅是因为map的参数态(parametricity),它有时也被称为自由定理(free theorem)。
修改:由于我们得到的这个第二法则或定理是免费的,仅仅是因为map的参数态(parametricity),它有时也被称为免费定理(free theorem)。
注释10
原文:这和我们在代数方程式里做的简化过程一样。
修改:这和我们在代数方程式里做的代换和简化过程一样。
注释12 // 译注:在优化界有一个著名的定理叫“没有免费午餐定理”,这个论文的题目可能是想与之呼应
原文:”自由定理”的观点来自于 Philip Wadler 的经典论文《Theorem for Free》(http://mng.bz/Z9f1)
修改:”免费定理”的观点来自于 Philip Wadler 的经典论文《Theorem for Free》(http://mng.bz/Z9f1)
页数:103
原文:某些情况下,Gen[A] 的空间(domain)足够小
修改:某些情况下,Gen[A] 的定义域(domain)足够小
注释2
原文:这里的“空间”(domian)与函数空间一样
修改:这里的“定义域”(domian)与函数定义域一样
页数:108
// Refining 在编译器里更多翻译为”具化"
原文:8.2.5 精炼 Prop 的数据类型
修改:8.2.5 具化 Prop 的数据类型
页数:117
注释13
原文:回忆一下在第7章中我们曾介绍过的自由定理,
修改:回忆一下在第7章中我们曾介绍过的免费定理,
页数:117
// 风格不符
原文:9.1 代数设计,走起
修改:9.1 代数设计
页数:153
注释3
原文:因为借用了已经存在的数据抽象名称
修改:因为借用了已经存在的数学抽象名称
页数:164
// primitive翻译为原语,保持一致风格
原文:State中(除了unit和flatMap)其他原始的操作
修改:State中(除了unit和flatMap)其他原语操作
原文:它们和monadic原始操作(unit和flatMap) 一起构成了State数据类型的所有操作。monad一般都是这样的,它们都包括unit和flatMap,并且每个monad又有自己额外的原始操作。
修改:它们和monadic原语操作(unit和flatMap) 一起构成了State数据类型的所有操作。monad一般都是这样的,它们都包括unit和flatMap,并且每个monad又有自己额外的原语操作。
页数:172
原文:Applicative构建了上下文自由的计算,
修改:Applicative构建了上下文无关的计算,
页数:210
原文:本地影响和可变状态
修改:局部作用和可变状态
页数:212
注释1
原文:也无须每次在充分利用本地变更(local mutation)时使用。
修改:也无须每次在充分利用局部变更(local mutation)时使用。
页数:214
// primitive 统一翻译为原语
原文:这里依旧采用组合子库加一些基元函数(primitive)的形式,其中关于可变内存单元的应有的基元函数有:
修改:这里依旧采用组合子库加一些原语函数(primitive)的形式,其中关于可变内存单元的应有的原语函数有:
页数:217
// primitive 统一翻译为原语
原文:为此,我们需要先实现可变数组的基元组合子:
修改:为此,我们需要先实现可变数组的原语组合子:
页数:218
// 基元->原语,负责->复杂
原文:有了这些基元函数,我们便可以实现更负责的数组函数了。
修改:有了这些原语函数,我们便可以实现更复杂的数组函数了。
原文:我们不如把这变成一个基元函数:
修改:我们不如把这变成一个原语函数:
页数:219
练习14.3
原文:为 scala.collection.mutable.HashMap 实现一组最小的基元组合子。
修改:为 scala.collection.mutable.HashMap 实现一组最小的原语组合子。
页数:240
原文:链状混合(Zipping)是Tee特有的一种情况,
修改:拉链式操作(Zipping)是Tee特有的一种情况,
页数:242
原文:请用存在基元函数实现join,
修改:请用已存在的原语函数实现join,