1

想了解下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,再写这部分的问题。加油!!

请关注我的公众号哦。
图片描述


ideami
91 声望11 粉丝

引用和评论

0 条评论