Haskell mtl、变形金刚、单子fd、单子IB和选择悖论

Haskell mtl、变形金刚、单子fd、单子IB和选择悖论,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,Hackage为monad变压器提供了几个软件包: :Monad转换器库 :具体函子和单子变换器 :Monad类,使用函数依赖项 :Monad类,使用类型族 :单子变压器的集合 :使用类型族的Monad转换器库 :模块化Monad转换器库 :带类型索引的Monad transformer库,提供“免费”副本 :可组合单体变压器 (也许我错过了一些) 我们用哪一种 mtl是Haskell平台中的一个,但我一直在reddit上听说它不酷 但不管怎样,选择有什么坏处,它不只是一件好事吗 例如,我看

Hackage为monad变压器提供了几个软件包:

  • :Monad转换器库
  • :具体函子和单子变换器
  • :Monad类,使用函数依赖项
  • :Monad类,使用类型族
  • :单子变压器的集合
  • :使用类型族的Monad转换器库
  • :模块化Monad转换器库
  • :带类型索引的Monad transformer库,提供“免费”副本
  • :可组合单体变压器
(也许我错过了一些)

我们用哪一种

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

但不管怎样,选择有什么坏处,它不只是一件好事吗

例如,我看到data accessor的作者为了迎合流行的选择,不得不做这些事情:

  • 数据存取器monadLib库:monadLib的monads的存取器函数
  • 数据访问器monads fd library:使用访问器访问monads fd state monad类中的状态
  • 数据访问器monads tf库:使用访问器访问monads tf state monad类型族中的状态
  • 数据访问器mtl库:使用访问器访问mtl state monad类中的状态
  • 数据访问器transformers library:使用访问器访问transformers state monad中的状态
我想,如果这种情况继续下去,例如几个相互竞争的Arrow软件包不断发展,我们可能会看到类似的东西:Spooklink arrows变形金刚、Spooklink arrows monadLib、Spooklink tfArrows变形金刚、Spooklink tfArrows monadLib

然后我担心如果Spooklink被分叉,黑客攻击将耗尽磁盘空间。:)

问题:

  • 为什么有这么多monad transformer包
  • 为什么mtl[被认为]不酷
  • 关键区别是什么
  • 这些看似相互竞争的软件包大多由安迪·吉尔(Andy Gill)编写,由罗斯·帕特森(Ross Paterson)维护。这是否意味着这些软件包不是相互竞争,而是以某种方式协同工作?安迪和罗斯认为他们自己的包裹是否过时了?
  • 你和我应该用哪一个

    • 它们中的许多几乎完全相同:

      • mtl
        使用GHC扩展,但是
        transformers
        是Haskell 98
      • monads fd
        monads tf
        transformers
        的附加组件,分别使用函数依赖项和类型族,两者都提供
        mtl
        transformers
        中缺少的功能
      • mtl tf
        是使用类型族重新实现的
        mtl
      因此本质上,
      mtl
      =
      变形金刚
      ++
      monads-fd
      mtl-tf
      =
      变形金刚
      ++
      monads-tf
      。我认为,
      transformers
      及其相关软件包的可移植性和模块性的提高是
      mtl
      如今不酷的原因

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

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

      乍一看,
      composetrans
      似乎更像是用于创建monad转换器的元编程工具。它声称与Control.Monad.Trans兼容,后者。。。我想是指mtl的意思吧

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

      • 新项目需要标准单子吗?使用变压器公司帮助我们放置mtl
      • 您是否已经在大型项目中使用了
        mtl
        <代码>变形金刚并不完全兼容,但没有人会因为你不切换而杀了你
      • 其他软件包是否提供了您所需要的不同寻常的功能?最好使用它,而不是自己滚动
      • 还不满意吗?扔掉它们,下载,用一页半令人费解的抽象废话,惊人的通用代码解决世界上所有的问题

      现在呢?您可能应该使用
      mtl
      。正在发生的事情是,
      transformers
      库以一种方式从MTL中分离出来,
      monads fd
      monads tf
      可以和平共存,但最后检查情况并非如此

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

      因此,我将编写
      mtl
      ,但不依赖于状态、读取器等当前是
      数据的事实,因为它们将被
      类型
      s替换


      MonadLib
      是Iavor一直在研究的另一种替代方案,它可以安全地使用,因为它与其他模块没有共享任何模块名称,但它的使用模式却截然不同。

      中提到的爱德华·科米特(Edward Kmett)的分解已于2010年底完成。它的最终结果是monads fd,建立在变形金刚之上,成为mtl的第2版。由于mtl的普遍存在,monads tf从未真正流行起来。截至2017年初,mtl和transformers是唯一广泛使用的monad transformer库。

      在什么意义上共存?由同一个软件包使用?导入到同一模块中?合并到同一个变压器堆栈中?总的来说,混合使用FundeP和TFs对我来说是个坏主意。无论如何,我还没有广泛使用
      transformers
      &co。但是在切换一些参数时,除了与
      mtl
      的一些细微的API差异外,我没有注意到任何问题