fd,monadLib和选择的悖论

Hackage提供了几个适用于monad变压器的软件包:

  • mtl:Monad变压器库
  • 变形金刚:混凝土仿真器和单体变压器
  • monads-fd:Monad类,使用函数依赖关系
  • monads-tf:Monad类,使用类型族
  • monadLib:monad变换器的集合。
  • mtl-tf:使用类型族的Monad变换器库。
  • mmtl:模块化Monad变压器库
  • mtlx:带有类型索引的Monad变换器库,提供'免费'副本。
  • compose-trans:可组合的单体变压器
  • (也许我错过了一些)

    我们应该使用哪一个?

    mtl是Haskell平台中的一员,但我一直听到reddit的消息说它并不酷。

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

    那么,我看到了数据访问者的作者是如何使所有这些都迎合流行的选择的:

  • data-accessor-monadLib库:monadLib monad的访问器函数
  • data-accessor-monads-fd library:使用Accessor访问monads-fd State monad类中的状态
  • data-accessor-monads-tf库:使用Accessor访问monads-tf State monad类型系列中的状态
  • data-accessor-mtl library:使用Accessor访问mtl State monad类中的状态
  • 数据访问器或变换器库:使用访问器访问变换器状态单元中的状态
  • 我想如果这样下去,例如几个竞争性的箭头包发展,我们可能会看到类似的东西:勺子链接箭头变形金刚,勺子链接箭头monadLib,spoonklink-tf箭头变换器,spoonklink-tfArrows-monadLib,...

    然后我担心如果spoonklink分叉,Hackage将耗尽磁盘空间。 :)

    问题:

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

  • 它们中的一些几乎完全相同:

  • mtl使用GHC扩展,但transformers是Haskell 98。
  • monads-fdmonads-tftransformers的附件,分别使用功能依赖和类型系列,两者都提供了transformers缺少的mtl功能。
  • mtl-tfmtl使用类型的家庭重新实现。
  • 所以基本上, mtl == transformers ++ monads-fdmtl-tf == transformers ++ monads-tf 。 我认为, transformers及其相关套件的改进的便携性和模块化是为什么mtl现在不冷却的原因。

    mmtlmtlx似乎都与mtl类似和/或基于mtl ,具有API差异和额外功能。

    MonadLib似乎在处理问题上有相当不同的看法,但我并不直接熟悉它。 也似乎使用了很多GHC扩展,比其他更多。

    一眼看来, compose-trans似乎更像是元编程创建单核变压器的东西。 它声称与Control.Monad.Trans兼容...我猜的意思是mtl

    无论如何,我会建议以下决策算法:

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

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

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

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

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


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

    链接地址: http://www.djcxy.com/p/66621.html

    上一篇: fd, monadLib, and the paradox of choice

    下一篇: Count(*) vs Count(1)