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