【Haskell】《魔力Haskell》Ch01~Ch10勘误总结

想了解下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,再写这部分的问题。加油!!
请关注我的公众号哦。