95

Hackage 有几个用于 monad 转换器的包:

  • mtl : Monad 转换器库
  • 变压器:具体函子和单子变压器
  • monads-fd : Monad 类,使用函数依赖
  • monads-tf : Monad 类,使用类型族
  • monadLib:monad 转换器的集合。
  • mtl-tf:使用类型族的 Monad 转换器库。
  • mmtl : 模块化 Monad 变压器库
  • mtlx:具有类型索引的 Monad 转换器库,提供“免费”副本。
  • compose-trans : 可组合的 monad 转换器

(也许我错过了一些)

我们应该使用哪一个?

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

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

好吧,我看到了例如 data-accessor 的作者如何不得不做出所有这些来迎合流行的选择:

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

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

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

问题:

  • 为什么有这么多单子变压器包?
  • 为什么 mtl [认为] 不酷?
  • 主要区别是什么?
  • 大多数这些看似相互竞争的软件包都是由 Andy Gill 编写的,并由 Ross Paterson 维护。这是否意味着这些软件包不是相互竞争而是以某种方式协同工作?Andy 和 Ross 是否认为他们自己的软件包已经过时?
  • 你和我应该使用哪一个?
4

3 回答 3

74

其中一堆几乎完全等价:

  • mtl使用 GHC 扩展,但是transformers是 Haskell 98。
  • monads-fd并且monads-tf是. transformers_ mtl_transformers
  • mtl-tfmtl使用类型族重新实现。

所以本质上,mtl== transformers++ monads-fdmtl-tf== transformers++ monads-tf。我认为,改进的可移植性和模块化transformers及其相关软件包是mtl这些天不酷的原因。

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

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

乍一看compose-trans似乎更像是用于创建 monad 转换器的元编程东西。它声称与...兼容,Control.Monad.Trans我猜是什么意思mtl

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

  • 你需要一个新项目的标准单子吗?Use transformers& co.,帮助我们mtl休息。
  • 您是否已经mtl在大型项目中使用?transformers不完全兼容,但没有人会因为不切换而杀死你。
  • 其他软件包之一是否提供了您需要的不寻常功能?还不如使用它而不是自己滚动。
  • 还是不满意?把它们全部扔掉,下载并用一页半难以理解的抽象废话惊人的通用代码category-extras解决世界上的所有问题。
于 2010-05-04T23:37:14.090 回答
19

暂时?您可能应该使用mtl. 正在发生的事情是,图书馆transformers正在以一种可以和平共存的方式从 MTL 中分离出来,但最后检查一下,情况还不是这样。monads-fdmonads-tf

发生这种情况时,您将能够导入monads-fdtransformers获取(几乎)相同的接口,除了State, etc. 将是StateT.

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

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

于 2010-05-05T00:28:46.943 回答
18

Edward Kmett 在他的回答中提到的分解是在 2010 年底完成的。它的最终结果是monads-fd,建立在transformers之上,成为mtl的第 2 版。由于mtl无处不在,monads-tf从未真正流行起来。截至 2017 年初,mtl转换器是唯一被广泛使用的 monad 转换器库。

于 2017-03-04T23:48:51.367 回答