RWH的主要问题
老了 RWH是在使用GHC 6.8版本时编写的。6.8使用的基本版本3.0.xx 6.10.1已使用4.0.0.0,这引入了许多更改。那仅仅是从6.8到6.10的跳跃。当前版本的GHC是7.10。单声道已更改。公司目前旗下有一个讨论,除去return
从Monad
,所以Monad
在真实世界哈斯克尔情况真的会同步出与现实世界。
话虽如此,它仍然是通用指南的有用资源。但是请记住,自发布以来,许多库都发生了变化。
在阅读RWH时,您可以阅读的内容是Stephen Diehl撰写的“学习Haskell时我希望知道的东西”。它提供了更多的见解,但请注意,某些部分并不真正适合新手。
一般说明
- 阅读评论。它们通常包含给定段落/节是否仍然相关和/或有效的信息。
- 阅读您要使用的库/功能的文档。即使您很懒,也至少要知道类型。
章节注释
这只是我阅读RWH时注意到的一些内容的快速概述。这可能是不完整的。
第2章类型和函数与FTP
自GHC 7.10起。
的类型null
已由于Foldable-Traversable-Proposal而更改。许多其他的功能,比如,和其他许多以前只用于定义在已被替换为更普遍的变种。foldr
foldl
[a]
Prelude
Foldable t => t a
从2010年Haskell平台或2008年末开始。
尽管在脚注中提到了这一点,但是QuickCheck库从版本1到版本2进行了许多更改。例如,generate
现在使用Gen a
代替StdGen
,而旧generate
功能在中Test.QuickCheck.Gen.unGen
。
如有疑问,请查阅文档。
Chapter 14. Monads和Chapter 15.使用monads编程
代码破解: Applicative m => Monad m
从GHC 7.10开始,Applicative
现在是的超类Monad
,而这是2007年未计划的。
在GHC 7.10中,Applicative
将成为的超类Monad
,可能会破坏许多用户代码。为了简化此过渡,当定义与Applicative-Monad提案(AMP)冲突时,GHC现在会生成警告。
请参阅7.8.1发行说明。
在State
/ Writer
/ Reader
单子
请在真实状态的monad中站起来吗?作者声称
为了定义一个Monad
实例,我们必须提供一个适当的类型构造,以及用于定义(>>=)
和return
。这使我们得到的真正定义State
。
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
这不再是真的,因为State
和它的朋友现在通过
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
因此,它们是由其monad变压器定义的。
整个章节都很好,但是正如人们可以在评论中或在Yuras Shumovich的博客上阅读的那样,以下代码中的finalizer部分是不好的做法:
pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
then do
err <- peekCString =<< peek errptr
return (Left err)
else do
reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
return (Right (Regex reg str))
作为malloc()
应与使用free()
,new
有delete
,allocate
有deallocate
,每个人都应该使用正确的功能。
TL; DR您应该始终使用为您分配内存的分配器释放内存。
如果外部函数分配了内存,则还应该使用随附的释放函数。
错误处理从6.8完全更改为6.10,但是您已经注意到了。最好阅读文档。
一些例子似乎被打破了。此外,还有其他HTTP库可用。
常规配置技术仍然相同,该示例(请参见下文)是对程序中可能出现的问题的很好的案例研究。但是RWH缺少多线程分析,例如通过ThreadScope。而且,据我所知,整本书并不关注惰性IO。
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
第24章和第28章(并行和并行编程和STM)
虽然第24章“并行和多核编程”和第28章“软件事务存储”仍然很重要,但是Simon Marlow的《Haskell中的Parallel and Concurrent Programming》一书仅着重于并发和并行编程,这是最近的著作(2013年)。RWH中完全缺少GPU编程和repa。
与其他章节一样,设计库的一般准则仍然写得很好并且相关。但是,由于涉及到一些更改(?)ST
,因此无法再编译结果。
Chapter 27.网络编程
它仍然大部分是最新的。毕竟,网络编程不会轻易改变。但是,代码使用了不赞成使用的函数bindSocket
和sClose
,应将和替换为bind
和close
(最好是通过合格的导入)。请记住,它是非常低级的,您可能想使用更专业的高级库。
GHC 6.8是引入Haskell平台之前的最新版本。因此,附录告诉您手工获取GHC和Cabal。别。相反,请按照haskell.org 下载页面上的说明进行操作。
另外,附录也不会告诉您Cabal沙箱,而Cabal沙箱是在Cabal 1.18中引入的,可以使您摆脱依赖地狱。当然,stack
完全没有了。
缺少内容
RWH中根本没有讨论某些主题。这包括流媒体库,例如管道和导管,以及镜头。
有一些关于这些主题的资源,但是这里有一些引言链接,可以使您了解它们的含义。另外,如果要使用向量,请使用该vectors
包。
Control.Applicative
RWH用途Control.Applicative
的(<$>)
几个点,但并不能解释Control.Applicative
的。LYAH和Typeclassopedia包含有关的内容Applicative
。鉴于这Applicative
是Monad
(参见上文)的超类,建议您认真学习该类。
此外,几家运营商Control.Applicative
(以及类型类本身)现在的一部分Prelude
,所以请确保您的运营商不冲突<$>
,<*>
等等。
镜片
流媒体库
工装
- Cabal的1.18版,其中引入了沙箱
stack
,用于开发Haskell项目的跨平台程序
ghc-mod
,是vim,emacs,Sublime Text和其他编辑器的后端
新的/缺少的语言扩展和GHC更改
- 运行时类型多态(
:i ($)
已发生巨大变化)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- 6.6之后发生的任何其他扩展