mtl,变形金刚,monads-fd,monadLib以及select的悖论

Hackage有几个monad变压器的软件包:

  • mtl :Monad变压器库
  • 变形金刚 :具体仿函数和单子变压器
  • monads-fd :Monad类,使用函数依赖关系
  • monad-tf :Monad类,使用types族
  • monadLib :monad变换器的集合。
  • mtl-tf :使用types族的Monad变换器库。
  • mmtl :模块化Monad变压器库
  • mtlx :带有types索引的Monad变换器库,提供“免费”拷贝。
  • compose-trans :可组合的monad变压器

(也许我错过了一些)

我们应该使用哪一个?

mtl是Haskell平台中的一个,但是我一直听到reddit的说法,它并不冷静。

但无论如何,select有什么不好,这不是一件好事吗?

那么,我看到了例如数据访问者的作者必须使所有这些才能迎合stream行的select:

  • data-accessor-monadLib库:monadLib monad的访问器函数
  • data-accessor-monads-fd库:使用Accessor访问monads-fd状态monad类中的状态
  • data-accessor-monads-tf库:使用Accessor访问monads-tf状态monadtypes系列中的状态
  • data-accessor-mtl库:使用Accessor访问mtl状态monad类中的状态
  • 数据访问器或变换器库:使用访问器访问变换器状态单元中的状态

我想如果这样做,例如几个竞争的箭头包发展,我们可能会看到类似:勺子链接箭头变形金刚,勺子箭头monadLib,spoonklink-tf箭头变换器,spoonklink-tf箭头monadLib,…

然后我担心,如果spoonklink分叉,Hackage将用完磁盘空间。 🙂

问题:

  • 为什么有这么多的monad变压器封装?
  • 为什么mtl [考虑]不酷?
  • 关键的区别是什么?
  • 这些看似相互竞争的软件包大部分都是由Andy Gill编写的,由Ross Paterson维护。 这是否意味着这些软件包不是竞争,而是以某种方式一起工作? 安迪和罗斯是否认为他们自己的软件包已经过时了?
  • 你应该使用哪一个?

一堆他们几乎完全等效:

  • mtl使用GHC扩展,但transformers是Haskell 98。
  • monads-fdmonads-tftransformers的附件,分别使用函数依赖和types族,两者都提供了transformers缺less的mtlfunction。
  • mtl-tf是使用types族重新实现的。

所以基本上, mtl == transformers ++ monads-fdmtl-tf == transformers ++ monads-tf 。 我认为, transformers及其相关配套的改进的便携性和模块化是为什么mtl现在不冷却的原因。

mmtlmtlx似乎都与mtl类似,并且基于mtl ,具有API差异和额外function。

MonadLib似乎有一个相当不同的事情,但我不直接熟悉它。 也似乎使用了很多的GHC扩展,比其他更多。

一眼就可以看出, compose-trans似乎更像是元编程创buildmonad变换器的东西。 它声称是与Control.Monad.Trans兼容…我猜的意思是mtl

无论如何,我会build议下面的决策algorithm:

  • 你需要一个新项目的标准单子吗? 使用transformers公司,帮助我们rest。
  • 您是否已经在一个大型项目中使用mtltransformers并不完全兼容,但没有人会因为不换你而杀了你。
  • 其他软件包之一是否提供您需要的特殊function? 也可以使用它,而不是滚动自己的。
  • 仍然不满意? 把它们全部扔出去,下载category-extras ,用一页半的难以理解的抽象废话令人惊叹的通用代码来解决世界上所有的问题。

目前呢? 你应该使用mtl 。 现在发生的事情是, transformers图书馆正在被MTL分解出来, monads-fdmonads-tf可以和平共处,但是最终检查结果还不是这样。

当发生这种情况时,你将能够导入monads-fdtransformers并获得(几乎)相同的接口,除了State等将成为StateT的别名。

所以我会写信给mtl ,但是不要依赖State,Reader等等当前的data因为它们将被type s取代。

MonadLib是Iavor一直在研究的另一种select,它可以安全地使用,因为它不与其他模块共享任何模块名称,但具有相当不同的使用模式。

Edward Kmett在他的回答中提到的因素在2010年底完成。其最终结果是monads-fd ,build立在变形金刚上 ,成为mtl的第二版。 作为mtl无处不在的结果, monads-tf从来没有真正被抓住。 截至2017年初, mtl变压器是唯一可以看到广泛使用的monad变压器库。