代码之家  ›  专栏  ›  技术社区  ›  yairchu

MTL、Transformers、Monads FD、Monadlib和选择悖论

  •  83
  • yairchu  · 技术社区  · 15 年前

    Hackage有几个Monad变压器包:

    (也许我错过了一些)

    我们用哪一个?

    MTL是Haskell平台上的一个,但我一直在听Reddit说它不酷。

    但不管怎样,选择有什么不好的地方,这不是一件好事吗?

    好吧,我看到了,例如,数据访问器的作者必须做出所有这些来满足流行的选择:

    • 数据访问器Monadlib库:Monadlib的Monads的访问器函数
    • 数据访问器monads fd library:使用访问器访问monads fd state monad类中的状态
    • 数据访问器monads tf library:使用访问器访问monads tf state monad type家族中的状态
    • 数据访问器MTL库:使用访问器访问MTL状态monad类中的状态
    • 数据访问器变压器库:使用访问器访问变压器状态monad中的状态

    我想,如果这种情况继续下去,例如,几个相互竞争的箭头包发生了变化,我们可能会看到类似的情况:sponklink arrows transformers、sponklink arrows monadlib、sponklink tfarrows transformers、sponklink tfarrows monadlib…。

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

    问题:

    • 为什么有这么多单体变压器包?
    • 为什么MTL[被认为]不酷?
    • 关键区别是什么?
    • 这些看似相互竞争的软件包大多是安迪·吉尔写的,由罗斯·帕特森负责维护。这是否意味着这些包不是相互竞争而是以某种方式协同工作?安迪和罗斯是否认为他们自己的包裹过时了?
    • 我和你应该用哪一个?
    3 回复  |  直到 8 年前
        1
  •  64
  •   imz -- Ivan Zakharyaschev    10 年前

    其中一组几乎完全等同:

    • mtl 使用GHC扩展,但 transformers 是哈斯克尔98。
    • monads-fd monads-tf 是附加组件 变压器 ,分别使用函数依赖项和类型族,两者都提供 甲氨蝶呤 那是失踪的 变压器 .
    • mtl-tf 甲氨蝶呤 使用类型族重新实现。

    因此,本质上, 甲氨蝶呤 = 变压器 ++ 莫纳德峡湾 , MTL TF = 变压器 ++ 单子TF . 改进的可移植性和模块化 变压器 它的相关包就是为什么 甲氨蝶呤 我想这几天不酷。

    mmtl mtlx 两者似乎都类似和/或基于 甲氨蝶呤 具有API差异和额外功能。

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

    一瞥 compose-trans 似乎更像是元编程的东西,用于创建monad变压器。它声称与 Control.Monad.Trans 哪个…我猜是什么意思 甲氨蝶呤 ?

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

    • 你需要一个新项目的标准单子吗?使用 变压器 &帮助我们躺下 甲氨蝶呤 休息。
    • 你已经在用了吗 甲氨蝶呤 在大型项目中? 变压器 不完全兼容,但没有人会因为不切换而杀了你。
    • 其他软件包中是否有一个提供了您所需的异常功能?最好用它而不是自己滚。
    • 还是不满意?全部扔掉,下载 category-extras 用一页半的 难以理解的抽象的胡说八道 惊人的通用代码。
        2
  •  20
  •   Edward Kmett    15 年前

    现在呢?你应该使用 mtl . 发生的是 transformers 图书馆被排除在MTL之外 monads-fd monads-tf 可以和平共处,但最后查证情况还没有。

    如果发生这种情况,您将能够导入 莫纳德峡湾 变压器 得到(几乎)相同的接口,除了 State 等将是的别名 StateT .

    所以我会写信给 甲氨蝶呤 但不依赖于状态、读卡器等 data 因为它们将被替换为 type S.

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

        3
  •  10
  •   Community CDub    8 年前

    爱德华·凯密特在 his answer 于2010年底竣工。最终结果是 莫纳德峡湾 建立在 变压器 ,成为第2版 甲氨蝶呤 . 由于 甲氨蝶呤 , 单子TF 从未真正流行过。截至2017年初, 甲氨蝶呤 变压器 是唯一一个广泛使用的Monad Transformer库。