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

yai*_*chu 84 monads haskell monad-transformers

Hackage有几个monad变换器包:

  • mtl:Monad变压器库
  • 变形金刚:混凝土仿函数和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 State monad类中的状态
  • data-accessor-monads-tf library:使用Accessor访问monads-tf状态monad类型系列中的状态
  • data-accessor-mtl library:使用Accessor访问mtl State 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维护.这是否意味着这些软件包不是竞争对手,而是以某种方式协同工作?安迪和罗斯认为他们自己的任何套餐都已过时吗?
  • 你和我应该使用哪一个?

C. *_*ann 65

其中一堆几乎完全等同:

  • mtl使用GHC扩展,但是transformers是Haskell 98.
  • monads-fd并且monads-tf分别是transformers使用功能依赖项和类型系列的附加组件,两者都提供了mtl缺少的功能transformers.
  • mtl-tfmtl使用类型的家庭重新实现.

基本上,mtl== transformers++ monads-fd,mtl-tf== transformers++ monads-tf.我认为,改进的便携性和模块化transformers及其相关的包装是mtl我们现在这样做的原因.

mmtl并且mtlx两者似乎都mtl与API差异和额外功能类似和/或基于它们.

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

乍一看compose-trans似乎更像是元编程创建monad变换器的东西.它声称与Control.Monad.Trans哪个兼容...我的意思是mtl

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

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

  • 因为我发现这篇文章非常有用.我以为我会更新其他googlers:mtl现在依赖于变形金刚,monads-fd现在是mtl的存根.因此,如果您需要额外的好东西,请使用mtl,或者如果它具有您需要的一切,则只需导入变换器. (25认同)
  • @yairchu:那基本上就是在做什么.mtl的下一个主要版本应该是导入变换器+ monads-fd的存根,并且与该版本的兼容性将是决定性因素.然后,库将能够单独更新,以便它们与mtl 1.1和1.2兼容,然后将应用程序分类到安装的任何版本或其最严格的库依赖项所需的版本. (5认同)
  • 如果mtl == transformers ++ monads-fd,难道不能以这种方式实现吗?(作为取代它的阶段),这将摆脱像data-accessor-mtl这样的东西的需要 (2认同)
  • @yairchu:是的,但是你希望我怎么做呢?:)保持向后兼容性并不像看起来那么容易,更改密钥库需要时间,精力和一定程度的社区支持.monad变压器情况是一个众所周知的问题,但我不认为这是任何人的首要任务. (2认同)
  • 图书馆邮件列表目前正在讨论移动MonadIO(可能还有MonadTrans从mtl移到基地.虽然"MonadBase"需要MPTC,fundeps等,但它是否已经开始关注是否提取MonadIO或更普通的MonadBase. . (2认同)

Edw*_*ETT 20

目前?你可能应该使用mtl.正在发生的事情是,transformers库被分解出来的母语在时尚monads-fdmonads-tf能够和平共处,但最后的支票,还没有的情况.

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

所以我写信mtl,但不依赖于State,Reader等目前正在datatypes 代替的事实.

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

  • 在什么意义上共存?由同一个包使用?导入到同一个模块?组合成相同的变压器堆栈?总的来说,混合fundeps和TF会让我觉得一个坏主意.无论如何,我还没有广泛使用`变形金刚'和co.但是,当切换一些(相当简单的)代码时,除了一些微小的API差异与`mtl`之外没有发现任何问题. (4认同)
  • 问题归结为这样一个事实,即您只能加载一个提供给定模块的包.因此,如果您使用的是使用mtl的库,即使是在内部,也无法导入替代方案.目前,一个健康的hackage百分比在某种程度上在内部使用mtl.许多人喜欢使用类型系列,而monads-tf给出了它们,但请记住,此刻,直到变换器+ monads-fd重构完成,这将锁定该代码,使其不能使用任何传递上需要MTL的库.这包括一些非常大的票. (4认同)

dup*_*ode 12

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