在Real World Haskell的第19章中,由于 Control.Exception
的变化,很多例子现在都失败了 .
这让我觉得也许本书中的一些内容实际上已经过时,不再值得学习,毕竟它已经有6年了 . 我唯一的另一个参考是学习你是一个伟大的好的Haskell,虽然它比RWH更基本 .
任何读过这本书的人都可以就哪些部分不再相关提出一些建议吗?特别是本书后半部分的章节,例如软件事务内存,并发编程,套接字编程等 .
编辑:这是关于2008年12月出版的书的版本,这是迄今为止唯一的已知版本(2017年11月)
1 回答
RWH的主要问题
It's old. RWH是在使用GHC 6.8的时候编写的 . 6.8使用基础版本3.0.x.x. 6.10.1已经使用4.0.0.0,其中引入了many changes . 那个's just the jump from 6.8 to 6.10. The current version of GHC is 7.10. Monads have been changed. There'目前正在讨论to remove return from Monad,所以真实世界Haskell中的
Monad
实例真的会与现实世界不同步 .话虽如此,它仍然是一般指导方针的有用资源 . 但请记住,许多库自发布以来已发生变化 .
阅读RWH时你可以阅读的东西是"What I Wish I Knew When Learning Haskell" by Stephen Diehl . 它提供了额外的洞察力,但要注意,有些部分并不是真正的新人友好 .
一般性评论
阅读评论 . 它们通常包含给定段落/部分是否仍然相关和/或有效的信息 .
阅读您要使用的库/函数的文档 . 即使你很懒,也要知道至少类型 .
各章的评论
这只是我在阅读RWH时注意到的一些事情的快速概述 . 这可能是不完整的 .
第2章类型和功能与FTP
自GHC 7.10起 .
由于Foldable-Traversable-Proposal,null的类型已changed . 许多其他函数,例如
foldr
,foldl
以及之前仅在Prelude
中为[a]
定义的许多其他函数已被替换为更通用的Foldable t => t a
变体 .第11章 . 测试和质量保证
自Haskell-platform 2010或2008年末以来 .
虽然在footnote中提到了这一点,但QuickCheck库在许多方面已经从版本1更改为版本2.例如,
generate
现在使用Gen a
而不是StdGen
,而旧generate
的功能在Test.QuickCheck.Gen.unGen
中 .如有疑问,请查看documentation .
第14章Monads和第15章使用monad进行编程
代码破坏:适用m => Monad m
截至GHC 7.10,
Applicative
现在是Monad
的超类,这是2007年没有计划的 .见7.8.1 release notes .
State / Writer / Reader monads
在Will the real state monad please stand up?部分,作者声称
这已不再适用,因为
State
及其朋友现在通过实施所以他们是由他们的monad变换器定义的 .
第17章与C的接口:FFI
整个章节很好,但正如人们可以在评论或Yuras Shumovich's blog中读到的那样,以下代码中的终结器部分是不好的做法:
由于
malloc()
应与free()
,new
与delete
,allocate
与deallocate
一起使用,因此应始终使用正确的函数 .如果外部函数分配内存,则还应使用附带的释放函数 .
第19章 . 错误处理
错误处理完全从6.8更改为6.10,但您已经注意到了 . 更好地阅读documentation .
第22章扩展示例:Web客户端编程
一些例子似乎被打破了 . 此外,还有其他HTTP库可用 .
第25章分析和优化
一般性能分析技术是仍然是相同的,并且示例(见下文)是一个很好的案例研究,可以解决您的程序中可能出现的问题 . 但RWH缺少多线程分析,例如通过ThreadScope . 另外,据我所知,整本书都不关心懒惰的IO .
第24章和第28章(并行和并行编程和STM)
虽然Chapter 24. Concurrent and multicore programming和Chapter 28. Software transactional memory仍然相关,但Simon Marlow的书Parallel and Concurrent Programming in Haskell专注于并发和并行编程,并且是最近的(2013年) . RWH中完全缺少GPU编程和修复 .
第26章高级库设计:构建Bloom过滤器
与其他章节一样,设计库的一般准则仍然写得很好且相关 . 但是,由于有关
ST
的某些更改(?),结果无法再编译 .第27章网络编程
它很容易改变 . 但是,代码使用已弃用的函数
bindSocket
和sClose
,它们应替换为bind
和close
(最好通过限定导入) . 请记住,它非常低级,您可能希望使用更专业的高级库 .附录A.安装GHC和Haskell库
GHC 6.8是Haskell平台推出之前的最后一个版本 . 因此,附录告诉您手动获取GHC和Cabal . 别 . 相反,请按照haskell.org download page上的说明进行操作 .
此外,附录中没有告诉您有关Cabal沙箱的信息,这些沙箱是在Cabal 1.18 and free you from dependency hell中介绍的 . 当然,
stack
完全没有了 .缺少内容
RWH根本没有讨论过一些主题 . 这包括流式库,如pipes和conduit,以及lenses .
这些主题有几种资源,但这里有一些介绍链接,可以让您了解它们的用途 . 此外,如果要使用向量,请使用vectors包 .
Control.Applicative
RWH在几个点上使用
Control.Applicative
的(<$>)
,但根本没有解释Control.Applicative
. LYAH和Typeclassopedia包含Applicative
上的部分 . 鉴于Applicative
是Monad
的超类(见上文),建议用心学习该类 .此外,
Control.Applicative
(以及类型类本身)的几个运算符现在是Prelude
的一部分,因此请确保您的运算符不与<$>
,<*>
和其他运算符冲突 .镜头
Video by Edward Kmett(
lens
的作者)Video by Adam Gundry "Lenses: compositional data access and manipulation"
Introduction and tutorial by Jakub Arnold
流媒体库
Conduit Overview by Michael Snoyman(
conduit
的作者)Pipes tutorial by Gabriel Gonzales(
pipes
的作者,包含在pipes
包中)工具
版本1.18 of Cabal,其中介绍sandboxes
stack,一个开发Haskell项目的跨平台程序
ghc-mod,vim,emacs,Sublime Text和其他编辑器的后端
新/缺少语言扩展和GHC更改
运行时类型多态(
:i ($)
发生了巨大变化)-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
6.6之后发生的任何其他扩展