首页 文章

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

提问于
浏览
101

在Real World Haskell的第19章中,由于 Control.Exception 的变化,很多例子现在都失败了 .

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

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

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

1 回答

  • 132

    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-Proposalnull的类型已changed . 许多其他函数,例如 foldrfoldl 以及之前仅在 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年没有计划的 .

    在GHC 7.10中,Applicative将成为Monad的超类,可能会破坏很多用户代码 . 为了简化这种转变,当定义与Applicative-Monad Proposal(AMP)冲突时,GHC现在会生成警告 .

    7.8.1 release notes .

    State / Writer / Reader monads

    Will the real state monad please stand up?部分,作者声称

    为了定义Monad实例,我们必须提供适当的类型构造函数以及(>> =)和return的定义 . 这导致我们对国家的真正定义 . - 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变换器定义的 .

    第17章与C的接口:FFI

    整个章节很好,但正如人们可以在评论或Yuras Shumovich's blog中读到的那样,以下代码中的终结器部分是不好的做法:

    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()newdeleteallocatedeallocate 一起使用,因此应始终使用正确的函数 .

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

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

    第19章 . 错误处理

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

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

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

    第25章分析和优化

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

    mean :: [Double] -> Double
    mean xs = sum xs / fromIntegral (length xs)
    

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

    虽然Chapter 24. Concurrent and multicore programmingChapter 28. Software transactional memory仍然相关,但Simon Marlow的书Parallel and Concurrent Programming in Haskell专注于并发和并行编程,并且是最近的(2013年) . RWH中完全缺少GPU编程和修复 .

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

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

    第27章网络编程

    它很容易改变 . 但是,代码使用已弃用的函数 bindSocketsClose ,它们应替换为 bindclose (最好通过限定导入) . 请记住,它非常低级,您可能希望使用更专业的高级库 .

    附录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根本没有讨论过一些主题 . 这包括流式库,如pipesconduit,以及lenses .

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

    Control.Applicative

    RWH在几个点上使用 Control.Applicative(<$>) ,但根本没有解释 Control.Applicative . LYAHTypeclassopedia包含 Applicative 上的部分 . 鉴于 ApplicativeMonad 的超类(见上文),建议用心学习该类 .

    此外, Control.Applicative (以及类型类本身)的几个运算符现在是 Prelude 的一部分,因此请确保您的运算符不与 <$><*> 和其他运算符冲突 .

    镜头

    流媒体库

    工具

    • 版本1.18 of Cabal,其中介绍sandboxes

    • stack,一个开发Haskell项目的跨平台程序

    • ghc-mod,vim,emacs,Sublime Text和其他编辑器的后端

    新/缺少语言扩展和GHC更改

    • 运行时类型多态( :i ($) 发生了巨大变化)

    • -XTypeInType

    • -XDataKinds

    • -XGADT

    • -XRankNTypes

    • -XGenericNewtypeDeriving

    • -XDeriveFunctor

    • 6.6之后发生的任何其他扩展

相关问题