想了解下 Haskell,于是乎就买了三本纸质书籍:《魔力 Haskell》、《Haskell 函数式程序设计》和《Haskell 函数式编程入门》,结合网上免费的电子版《Learn You a Haskell》,相互映照来学习。现在的进度是看完了《Learn You a Haskell》,《魔力 Haskell》看完了前 10 章,另外两本仅仅看了一些开头。
通过学习实践发现,真应了《魔力 Haskell》作者前言的话,现在 Haskell 资料过时比较严重,很多书里的代码用最新的 GHC 运行是有问题的。整体而言,《魔力 Haskell》这本书内容还算是新的,但错误也不少。所以,现在把一些错误总结一下,方便同看这本书的人,也记录下自己啃书的经历。ps. 作者在 github 上有开的 issues,自己还提交了一些错误,但错误没有排序,不利于查看。
错误详单
以下是一些不妥的地方:
P8 倒数第 8 行,应该为反引号。改为:
两侧加上 ` 即可。
P14 倒数第 8 行,证明这个词用得不妥,有人已经指出来了。我觉得改为验证可能更合适。
P21 倒数第 4 行,截至现在(GHC 8.6.3),标签冲突的问题还没解决。暂时还得按书上的建议来。
P27
Prelude 的那些部分函数也都有对应的全函数版本。
这块作者没说清楚,实际上这些安全版本在 safe 包内。
P31
列表实际上是一颗一叉树“颗”改为棵;应为二叉树,该页上面的图已经很明显了。
P39“4.3.1”标题上面的那句话,应为 replicate 这类返回函数的函数被称为高阶函数
P43~P44 中的所有 [100..1] 都改为[100,99..1]。原因 <Learn You a Haskell> 里已经有解释了,只不过例子是[20..1]
要得到从 20 到 1 之间的列表,[20..1]是不可以的,必须得[20,19..1]。对于没有提供步长的区间(如[20..1]),Haskell 会先构造一个空的列表,随后从区间的下限开始,不停地增长,直到大于等于上限为止。既然 20 已经大于 1 了,那么所得的结果只能是个空列表。
P45 第 3 行,(2^)改为(^2)
P48 最底下的两段伪代码是有问题的,语法都有问题:
第一个伪代码可改为:
case … of
pat1 | guard1,guard2,… -> …
pat2 | … -> …
.
.
.
第二个伪代码可改为:
case () of
_ | … -> …
| … -> …
完整的语法可参考 <haskell2010 report> 3.13 Case Expressions 一节。
P49 ghci 示例的代码去掉两个引号即可。参见 <haskell2010 report> 2.7 Layout
P53 FTP 这个缩写让人找不到北,是 Foldable/Traversable in Prelude proposal 的缩写。
P55 foldr 的展开,作者用了加法交换的定律对展开式进行了二次加工,实际上原始的展开式为:
foldr (+) 0 [1,2,3]– (+) 1 (foldr (+) 0 [2,3])– (+) 1 ((+) 2 (foldr (+) 0 [3]))– (+) 1 ((+) 2 ((+) 3 (foldr (+) 0 []))) — (+) 1 ((+) 2 ((+) 3 0))– 1 + (2 + (3 + 0))
P57 第 7、8 行,将数组改为列表
P59 最后一段首行,边字有误,改为遍
P60 maximum 改为 minimum
P67 nub 代码有误,改为
nub [] = []
nub (x:xs) = if x `elem` xs then nub xs
else x : nub xs
P73 isBigger 类型标注缺少::
P76 import Data.Word 应该放在 maxBound :: Word 之前,否则是没意义的
P81 构造函数首字母大写,应为 MakeURL
p82 由于 Inch 4,图中 y 盒子里的数字应为 4
P86 qsort 第二个模式匹配最右侧多了一个),去掉即可。
看完 Ch11~Ch20,再写这部分的问题。加油!!
请关注我的公众号哦。