swa*_*ang 104 haskell exception-handling
在Real World Haskell的第19章中,很多例子现在因为改变而失败了Control.Exception.
这让我觉得也许本书中的一些内容实际上已经过时,不再值得学习,毕竟它已经有6年了.我唯一的另一个参考是" 了解你是一个很好的Haskell",虽然它是一本很棒的书,但与RWH相比它更为基础.
任何读过这本书的人都可以就哪些部分不再相关提出一些建议吗?特别是本书后半部分的章节,例如软件事务内存,并发编程,套接字编程等.
编辑:这是关于2008年12月出版的书的版本,这是迄今为止唯一的已知版本(2017年11月)
Zet*_*eta 133
它太老了.RWH是在使用版本6.8的GHC时编写的.6.8使用的基础版本3.0.xx 6.10.1已经使用4.0.0.0,它引入了许多变化.这只是从6.8跳到6.10.当前版本的GHC是7.10.Monads已被更改.公司目前旗下有一个讨论,除去return从Monad,所以Monad在真实世界哈斯克尔情况真的会不同步与现实世界.
话虽如此,它仍然是一般指导方针的有用资源.但请记住,许多库自发布以来已发生变化.
阅读RWH时你可以读到的东西是Stephen Diehl撰写的"我在学习Haskell时想知道的事".它提供了额外的洞察力,但要注意,有些部分并不是真正的新人友好.
这只是我在阅读RWH时注意到的一些内容的快速概述.这可能是不完整的.
自GHC 7.10起.
由于Foldable-Traversable-Proposal,类型null已经改变.许多其他的功能,比如,和其他许多以前只用于定义在已被替换为更普遍的变种.foldrfoldl[a]PreludeFoldable t => t a
自Haskell-platform 2010或2008年末以来.
尽管脚注中提到了这一点,但QuickCheck库在许多方面已经从版本1更改为版本2.例如,generate现在使用Gen a而不是StdGen,而旧版本的功能generate在于Test.QuickCheck.Gen.unGen.
如有疑问,请查看文档.
Applicative m => Monad m截至GHC 7.10,Applicative现在是一个超级类别,Monad在2007年没有计划.
在GHC 7.10中,
Applicative将成为超类Monad,可能会破坏很多用户代码.为了简化这种转变,当定义与Applicative-Monad Proposal(AMP)冲突时,GHC现在会生成警告.
请参见7.8.1发行说明.
State/ Writer/ Reader单子在遗嘱真正的州monad请站起来?作者声称,该部分
为了定义一个
Monad实例,我们必须提供一个适当的类型构造,以及用于定义(>>=)和return.这导致我们真正的定义State.Run Code Online (Sandbox Code Playgroud)-- 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
Run Code Online (Sandbox Code Playgroud)
所以他们是由他们的monad变换器定义的.
整个章节很好,但正如人们可以在评论或Yuras Shumovich的博客中看到的那样,以下代码中的终结器部分是不好的做法:
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))
Run Code Online (Sandbox Code Playgroud)
作为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)
Run Code Online (Sandbox Code Playgroud)
虽然第24章并发和多核编程以及第28章软件事务内存仍然相关,但Simon Marlow的书籍Haskell中的并行和并发编程专注于并发和并行编程,并且是最近的(2013).RWH中完全缺少GPU编程和修复.
与其他章节一样,设计库的一般准则仍然写得很好且相关.但是,由于某些变化(?)ST,结果无法再编译.
它仍然是最新的.毕竟,网络编程不会那么容易改变.然而,代码使用废弃的函数bindSocket和sClose,这应改为bind和close(优选通过导入合格).请记住,它非常低级,您可能希望使用更专业的高级库.
GHC 6.8是Haskell平台推出之前的最后一个版本.因此,附录告诉您手动获取GHC和Cabal.别.请按照haskell.org 下载页面上的说明进行操作.
此外,附录没有告诉你关于Cabal沙箱的问题,这些沙箱是在Cabal 1.18中引入的,并且让你免于依赖地狱.当然,stack完全没有了.
RWH根本没有讨论过一些主题.这包括流媒体库,如管道和导管,以及镜头.
这些主题有几种资源,但这里有一些介绍链接,可以让您了解它们的内容.此外,如果要使用向量,请使用该vectors包.
Control.ApplicativeRWH使用Control.Applicative的(<$>)几个点,但并不能解释Control.Applicative的.LYAH和Typeclassopedia包含部分Applicative.鉴于这Applicative是一个超类Monad(见上文),建议用心去学习这个课程.
此外,几家运营商Control.Applicative(以及类型类本身)现在的一部分Prelude,所以请确保您的运营商不冲突<$>,<*>等等.
conduit)pipes包括在pipes包中的作者):i ($)已经发生巨大变化)-XTypeInType-XDataKinds-XGADT-XRankNTypes-XGenericNewtypeDeriving-XDeriveFunctor| 归档时间: |
|
| 查看次数: |
9309 次 |
| 最近记录: |