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

时间:2010-05-04 22:51:29

标签: haskell monads monad-transformers

Hackage有几个monad变换器包:

  • mtl:Monad变电站库
  • transformers:具体的仿函数和monad变换器
  • monads-fd:使用功能依赖的Monad类
  • monads-tf:使用类型系列的Monad类
  • monadLib:monad变形金刚的集合。
  • mtl-tf:使用类型系列的Monad变换器库。
  • mmtl:模块化Monad变压器库
  • mtlx:具有类型索引的Monad变换器库,提供“免费”副本。
  • compose-trans:可组合monad变换器

(也许我错过了一些)

我们应该使用哪一个?

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

但是无论如何选择还不错,这不是一件好事吗?

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

  • data-accessor-monadLib库:monadLib monad的访问器函数
  • data-accessor-monads-fd library:使用Accessor访问monads-fd状态monad类中的状态
  • data-accessor-monads-tf library:使用Accessor访问monads-tf状态monad类型系列中的状态
  • data-accessor-mtl library:使用Accessor访问mtl状态monad类中的状态
  • data-accessor-transformers library:使用Accessor访问变压器State monad中的状态

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

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

问题:

  • 为什么有这么多monad变压器包?
  • 为什么mtl [被认为]不冷却?
  • 有哪些主要区别?
  • 这些看似竞争的大部分包都是由Andy Gill编写的,由Ross Paterson维护。这是否意味着这些软件包不是竞争对手,而是以某种方式协同工作?安迪和罗斯认为他们自己的任何套餐都已过时吗?
  • 你和我应该使用哪一个?

3 个答案:

答案 0 :(得分:65)

其中一堆几乎完全等同:

  • mtl使用GHC扩展,但transformers是Haskell 98。
  • monads-fdmonads-tftransformers的附加组件,分别使用功能依赖项和类型系列,两者都提供mtltransformers中缺少的功能mtl-tf }。
  • mtl mtl使用类型系列重新实现。

基本上,transformers == monads-fd ++ mtl-tftransformers == monads-tf ++ transformers。 {I} mtl及其相关软件包的可移植性和模块性得到改善,这就是为什么mmtl这些天不为人所知。

mtlxmtl似乎与MonadLib相似和/或基于compose-trans,具有API差异和额外功能。

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

乍一看,mtl似乎更像是创建monad变换器的元编程。它声称与transformers兼容......我的意思是mtl

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

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

答案 1 :(得分:20)

目前?您应该使用mtl。发生的事情是,transformers库以monads-fdmonads-tf可以和平共存的方式从MTL中分解出来,但最后检查还不是这样的。

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

所以我写信给mtl,但不要依赖于State,Reader等目前data的事实,因为它们会被type替换。

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

答案 2 :(得分:11)

his answer中提到的Edward Kmett提到的因素已于2010年底完成。其最终结果是 monads-fd ,基于变形金刚,成为第2版of mtl 。由于 mtl 无处不在, monads-tf 从未真正流行起来。截至2017年初, mtl 变形金刚是唯一可以广泛使用的monad变换器库。