gpt4 book ai didi

haskell - 现实世界 Haskell 的哪些部分现在已经过时或被认为是不好的做法?

转载 作者:行者123 更新时间:2023-12-03 04:46:02 25 4
gpt4 key购买 nike

在 Real World Haskell 的第 19 章中,由于 Control.Exception 的更改,许多示例现在都失败了。 .

这让我觉得这本书中的一些东西实际上已经过时了,不值得再学习了,毕竟已经 6 年了。我唯一的其他引用是Learn You a
Haskell For Great Good,虽然它是一本好书,但与 RWH 相比,它的基础要简单得多。

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

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

最佳答案

RWH的主要问题

它老了。 RWH 是在使用 GHC 6.8 版时编写的。 6.8使用基本版本 3.0.x.x。 6.10.1 已经使用了 4.0.0.0,引入了 many changes .这只是从 6.8 到 6.10 的跳跃。 GHC 的当前版本是 7.10。单子(monad)已经改变。目前有讨论 to remove return from Monad ,所以 Monad现实世界中的实例 Haskell 将真正与现实世界不同步。

话虽如此,它仍然是通用指南的有用资源。但请记住,自发布以来,许多库都发生了变化。

您可以在阅读 RWH 的同时阅读的内容是 "What I Wish I Knew When Learning Haskell" by Stephen Diehl .它提供了额外的洞察力,但请注意,有些部分对新手并不友好。

一般说明

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

  • 章节备注

    这只是我在阅读 RWH 时注意到的一些事情的快速概述。应该是不完整的。

    第 2 章类型和函数 与 FTP

    从 GHC 7.10 开始。

    null 的类型已 changed由于 Foldable-Traversable-Proposal .许多其他功能,例如 foldr , foldl以及许多其他以前仅为 [a] 定义的内容在 Prelude已替换为更通用的 Foldable t => t a变种。

    Chapter 11. Testing and quality assurance

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

    虽然这是在 footnote 中提到的,QuickCheck 库从版本 1 到版本 2 在很多方面发生了变化。例如, generate现在使用 Gen a而不是 StdGen ,以及旧版 generate 的功能在 Test.QuickCheck.Gen.unGen .

    如有疑问,请查看 documentation .

    第 14 章 Monad 和第 15 章使用 monad 编程

    密码破解: Applicative m => Monad m
    自 GHC 7.10 起, Applicative现在是 Monad 的父类(super class),这是 2007 年没有计划的事情。

    In GHC 7.10, Applicative will become a superclass of Monad, potentially breaking a lot of user code. To ease this transition, GHC now generates warnings when definitions conflict with the Applicative-Monad Proposal (AMP).



    7.8.1 release notes .
    State/ Writer/ Reader单子(monad)

    Will the real state monad please stand up?部分,提交人声称

    In order to define a Monad instance, we have to provide a proper type constructor as well as definitions for (>>=) and return. This leads us to the real definition of State.

    -- file: ch14/State.hs
    newtype State s a = State
    runState :: s -> (a, s)
    }


    这不再是真的,因为 State和它的 friend 现在通过
    type State  s = StateT  s Identity
    type Writer w = WriterT w Identity
    type Reader r = ReaderT r Identity

    所以他们是由他们的 monad 转换器定义的。

    Chapter 17. Interfacing with C: the 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() 一起使用, newdelete , allocatedeallocate ,应始终使用正确的功能。

    TL;DR You should always free memory with the same allocator that allocated it for you.



    如果外部函数分配内存,您还应该使用随附的释放函数。

    Chapter 19. Error handling

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

    Chapter 22. Extended Example: Web Client Programming

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

    Chapter 25. Profiling and optimization

    一般的分析技术仍然相同,并且示例(见下文)是一个很好的案例研究,可以解决您的程序中可能出现的问题。但是 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 编程和修复。

    Chapter 26. Advanced library design: building a Bloom filter

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

    第 27 章网络编程

    它仍然主要是最新的。毕竟,网络编程并没有那么容易改变。但是,代码使用了不推荐使用的函数 bindSocketsClose ,应替换为 bindclose (最好通过合格的进口)。请记住,它是非常低级的,您可能需要使用更专业的高级库。

    Appendix A. Installing GHC and Haskell libraries

    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 的父类(super class)(见上文),建议记住该类(class)。

    此外, 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 包中)

  • 工装
  • Cabal 1.18 版本,引入了 sandboxes
  • stack ,用于开发 Haskell 项目的跨平台程序
  • ghc-mod ,vim、emacs、Sublime Text 和其他编辑器的后端

  • 新的/缺失的语言扩展和 GHC 更改
  • 运行时类型多态性(:i ($) 发生了巨大变化)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • 6.6 之后发生的任何其他扩展
  • 关于haskell - 现实世界 Haskell 的哪些部分现在已经过时或被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23727768/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com