首页 文章

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

提问于
浏览
83

Hackage有几个monad变换器包:

  • mtl:Monad变压器库

  • transformers:混凝土仿函数和monad变换器

  • monads-fd:Monad类,使用函数依赖项

  • monads-tf:Monad类,使用类型系列

  • monadLib:monad变形金刚的集合 .

  • mtl-tf:使用类型族的Monad变换器库 .

  • mmtl:模块化Monad变压器库

  • mtlx:具有类型索引的Monad变换器库,提供'free'副本 .

  • compose-trans:可组合的monad变换器

(也许我错过了一些)

我们应该使用哪一个?

mtl是Haskell平台中的一个,但我一直听说reddit它不太酷 .

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

好吧,我看到数据访问器的作者必须如何制作所有这些以满足流行的选择:

  • data-accessor-monadLib库:monadLib monad的访问器函数

  • data-accessor-monads-fd库:使用Accessor访问monads-fd状态monad类中的状态

  • data-accessor-monads-tf库:使用Accessor访问monads-tf状态monad类型系列中的状态

  • data-accessor-mtl库:使用Accessor访问mtl State monad类中的状态

  • data-accessor-transformers库:使用Accessor访问变换器状态monad中的状态

我想如果这种情况继续发展,例如几个竞争的箭头包演变,我们可能会看到类似:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib,...

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

问题:

  • 为什么有这么多monad变压器包?

  • 为什么mtl [被认为]不冷却?

  • 有哪些主要区别?

  • 这些看似竞争的大部分包都是由Andy Gill编写的,由Ross Paterson维护 . 这是否意味着这些软件包不是竞争对手,而是以某种方式协同工作?安迪和罗斯认为他们自己的任何套餐都已过时吗?

  • 你和我应该使用哪一个?

3 回答

  • 9

    其中一堆几乎完全等价:

    • mtl 使用GHC扩展,但 transformers 是Haskell 98 .

    • monads-fdmonads-tftransformers 的附加组件,分别使用功能依赖项和类型系列,两者都提供了 mtl 中缺少 transformers 的功能 .

    • mtl-tfmtl 使用类型系列重新实现 .

    基本上, mtl == transformers monads-fdmtl-tf == transformers monads-tf . 我认为,改进的 transformers 及其相关软件包的可移植性和模块性是为什么 mtl 这些日子不太酷的原因 .

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

    MonadLib 似乎对事情有不同的看法,但我并不直接熟悉它 . 似乎也使用了很多GHC扩展,比其他扩展更多 .

    一目了然 compose-trans 似乎更像是元编程的东西,用于创建monad变换器 . 它声称与 Control.Monad.Trans 兼容......我的意思是 mtl

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

    • 您是否需要新项目的标准单子?使用 transformers &co . ,帮助我们休息 mtl .

    • 您是否已在大型项目中使用 mtltransformers 不完全兼容,但没有人会因为没有切换而杀了你 .

    • 其他一个软件包是否提供了您需要的异常功能?不妨使用它而不是自己动手 .

    • 仍然不满意?把它们全部扔掉,下载category-extras,用一页半难以理解的抽象无意义的通用代码来解决所有世界的问题 .

  • 20

    目前?你应该使用 mtl . 正在发生的事情是, transformers 图书馆正在以一种和平共存的方式从MTL中分解出来,但最后检查的情况还不是这样 .

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

    所以我写信给 mtl ,但不要依赖State,Reader等目前 data 这个事实,因为它们将被 type 取代 .

    MonadLib 是Iavor一直在努力的另一种选择,可以安全使用,因为它不与其他模块共享任何模块名称,但具有完全不同的使用模式 .

  • 64

    爱德华·凯梅特在_782182中提到的因素在2010年底完成 . 它的最终结果是monads-fd, Build 在变形金刚之上,成为mtl的第2版 . 由于mtl无处不在,monads-tf从未真正流行起来 . 截至2017年初,mtl和变压器是唯一被广泛使用的monad变压器库 .

相关问题