现实世界Haskell的哪些部分现在已经过时或被视为不良做法?

swa*_*ang 104 haskell exception-handling

Real World Haskell的第19章中,很多例子现在因为改变而失败了Control.Exception.

这让我觉得也许本书中的一些内容实际上已经过时,不再值得学习,毕竟它已经有6年了.我唯一的另一个参考是" 了解你是一个很好的Haskell",虽然它是一本很棒的书,但与RWH相比它更为基础.

任何读过这本书的人都可以就哪些部分不再相关提出一些建议吗?特别是本书后半部分的章节,例如软件事务内存,并发编程,套接字编程等.

编辑:这是关于2008年12月出版的书的版本,这是迄今为止唯一的已知版本(2017年11月)

Zet*_*eta 133

RWH的主要问题

它太老了.RWH是在使用版本6.8的GHC时编写的.6.8使用的基础版本3.0.xx 6.10.1已经使用4.0.0.0,它引入了许多变化.这只是从6.8跳到6.10.当前版本的GHC是7.10.Monads已被更改.公司目前旗下有一个讨论,除去returnMonad,所以Monad在真实世界哈斯克尔情况真的会不同步与现实世界.

话虽如此,它仍然是一般指导方针的有用资源.但请记住,许多库自发布以来已发生变化.

阅读RWH时你可以读到的东西是Stephen Diehl撰写的"我在学习Haskell时想知道的事".它提供了额外的洞察力,但要注意,有些部分并不是真正的新人友好.

一般评论

  • 阅读评论.它们通常包含给定段落/部分是否仍然相关和/或有效的信息.
  • 阅读您要使用的库/函数的文档.即使你很懒,也要知道至少类型.

各章的评论

这只是我在阅读RWH时注意到的一些内容的快速概述.这可能是不完整的.

第2章类型和功能与FTP

自GHC 7.10起.

由于Foldable-Traversable-Proposal,类型null已经改变.许多其他的功能,比如,和其他许多以前只用于定义在已被替换为更普遍的变种.foldrfoldl[a]PreludeFoldable t => t a

第11章测试和质量保证

自Haskell-platform 2010或2008年末以来.

尽管脚注中提到了这一点,但QuickCheck库在许多方面已经从版本1更改为版本2.例如,generate现在使用Gen a而不是StdGen,而旧版本的功能generate在于Test.QuickCheck.Gen.unGen.

如有疑问,请查看文档.

第14章Monads和第15章使用monad进行编程

代码破解: 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.

-- file: ch14/State.hs
newtype State s a = State
    runState :: s -> (a, s)
}
Run Code Online (Sandbox Code Playgroud)

这不再是真的,因为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变换器定义的.

第17章与C的接口:FFI

整个章节很好,但正如人们可以在评论或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(),newdelete,allocatedeallocate,每个人都应该使用正确的功能.

TL; DR你应该总是使用为你分配它的相同分配器释放内存.

如果外部函数分配内存,则还应使用附带的释放函数.

第19章错误处理

错误处理完全从6.8更改为6.10,但您已经注意到了.更好地阅读文档.

第22章扩展示例:Web客户端编程

一些例子似乎被打破了.此外,还有其他HTTP库可用.

第25章分析和优化

一般性能分析技术仍然相同,示例(见下文)是一个很好的案例研究,可以解决您的程序中可能出现的问题.但RWH缺少多线程分析,例如通过ThreadScope.另外,据我所知,整本书都不关心懒惰的IO.

mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)

第24章和第28章(并行和并行编程和STM)

虽然第24章并发和多核编程以及第28章软件事务内存仍然相关,但Simon Marlow的书籍Haskell中的并行和并发编程专注于并发和并行编程,并且是最近的(2013).RWH中完全缺少GPU编程和修复.

第26章高级库设计:构建Bloom过滤器

与其他章节一样,设计库的一般准则仍然写得很好且相关.但是,由于某些变化(?)ST,结果无法再编译.

第27章网络编程

它仍然是最新的.毕竟,网络编程不会那么容易改变.然而,代码使用废弃的函数bindSocketsClose,这应改为bindclose(优选通过导入合格).请记住,它非常低级,您可能希望使用更专业的高级库.

附录A.安装GHC和Haskell库

GHC 6.8是Haskell平台推出之前的最后一个版本.因此,附录告诉您手动获取GHC和Cabal.别.请按照haskell.org 下载页面上的说明进行操作.

此外,附录没有告诉你关于Cabal沙箱的问题,这些沙箱是在Cabal 1.18中引入的,并且让你免于依赖地狱.当然,stack完全没有了.

缺少内容

RWH根本没有讨论过一些主题.这包括流媒体库,如管道导管,以及镜头.

这些主题有几种资源,但这里有一些介绍链接,可以让您了解它们的内容.此外,如果要使用向量,请使用该vectors包.

Control.Applicative

RWH使用Control.Applicative(<$>)几个点,但并不能解释Control.Applicative的.LYAHTypeclassopedia包含部分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之后发生的任何其他扩展