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


107

在“ 真实世界” Haskell的第19章中,由于的变化,现在许多例子都失败了Control.Exception

这使我认为,也许已经有6年了,这本书中的某些内容实际上已经过时了,不再值得研究了。我唯一的参考资料是《学好Haskell for Great Good》,虽然这是一本很棒的书,但与RWH相比,它更基础。

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

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


2
AFAIK Real World Haskell的在线版本将不时更新。也许您可以在Haskell Wikibook中找到更多有用的内容。
Vektorweg

@Vektorweg到目前为止,Wikibook上的大部分工作都是在介绍性章节(虽然与LYAH级别大致相同,尽管采取的方式不同)以及更高级的理论和类型系统主题中进行的。对于应用问题,如RWH swang的后续章节所述,RWH现在是更好的选择。即使,作为Wikibook的撰稿人,我希望这种情况最终会有所改变:)
duplode 2014年

1
@Vektorweg:我没有注意到印刷版和在线版之间有显着差异。另外,在线版本似乎根本没有更新,Bloom Filter章节已被打破很长时间了(至少2009年)。话虽这么说,维基百科,是的:)。
Zeta 2014年

1
@Swang请注意,即使是Learn Has Haskell也包含过时的东西,现在它Monad是的子类Applicative
jub0bs 2015年

1
请提及这本书的版本。通常,在谈论产品时,总是要提到版本平台操作系统版本等!
Nawaz

Answers:


137

RWH的主要问题

老了 RWH是在使用GHC 6.8版本时编写的。6.8使用的基本版本3.0.xx 6.10.1已使用4.0.0.0,这引入了许多更改。那仅仅是从6.8到6.10的跳跃。当前版本的GHC是7.10。单声道已更改。公司目前旗下有一个讨论,除去returnMonad,所以Monad在真实世界哈斯克尔情况真的会同步出与现实世界。

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

在阅读RWH时,您可以阅读的内容是Stephen Diehl撰写的“学习Haskell时我希望知道的东西”。它提供了更多的见解,但请注意,某些部分并不真正适合新手。

一般说明

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

章节注释

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

第2章类型和函数与FTP

自GHC 7.10起

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

第11章测试和质量保证

从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变压器定义的。

Chapter 17.与C的接口:FFI

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

TL; DR您应该始终使用为您分配内存的分配器释放内存。

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

第19章错误处理

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

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

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

第25章。分析和优化

常规配置技术仍然相同,该示例(请参见下文)是对程序中可能出现的问题的很好的案例研究。但是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。

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

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

Chapter 27.网络编程

它仍然大部分是最新的。毕竟,网络编程不会轻易改变。但是,代码使用了不赞成使用的函数bindSocketsClose,应将和替换为bindclose(最好是通过合格的导入)。请记住,它是非常低级的,您可能想使用更专业的高级库。

附录A.安装GHC和Haskell库

GHC 6.8是引入Haskell平台之前的最新版本。因此,附录告诉您手工获取GHC和Cabal。别。相反,请按照haskell.org 下载页面上的说明进行操作。

另外,附录也不会告诉您Cabal沙箱,而Cabal沙箱是在Cabal 1.18中引入的,可以使您摆脱依赖地狱。当然,stack完全没有了。

缺少内容

RWH中根本没有讨论某些主题。这包括流媒体库,例如管道导管,以及镜头

有一些关于这些主题的资源,但是这里有一些引言链接,可以使您了解它们的含义。另外,如果要使用向量,请使用该vectors包。

Control.Applicative

RWH用途Control.Applicative(<$>)几个点,但并不能解释Control.Applicative的。LYAHTypeclassopedia包含有关的内容Applicative。鉴于这ApplicativeMonad(参见上文)的超类,建议您认真学习该类。

此外,几家运营商Control.Applicative(以及类型类本身)现在的一部分Prelude,所以请确保您的运营商不冲突<$><*>等等。

镜片

流媒体库

工装

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

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

  • 运行时类型多态(:i ($)已发生巨大变化)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • 6.6之后发生的任何其他扩展

谢谢,这正是我所追求的:),您使我想起了state monad的问题,它不再具有State值构造函数,花了我一些时间来弄清楚我何时阅读它。
swang 2014年

@swang:距离完成还很远。也许布莱恩(Bryan)或唐(Don)对更改的功能了解更多。无论哪种方式,通用指南仍然有效。
Zeta 2014年

1
对于高级网络,我更喜欢简单网络
Lambda Fairy 2014年

“转换器”,协程与流库管道,导管之间存在关系。
CMCDragonkai 2015年

HDBC的使用是否被认为已过时?
Janus Troelsen,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.