Hackage有几个monad变换器包:
(也许我错过了一些)
我们应该使用哪一个?
mtl是Haskell平台中的一个,但我一直听说reddit它是不酷的。
但是无论如何选择还不错,这不是一件好事吗?
嗯,我看到数据访问者的作者必须如何制作所有这些以满足流行的选择:
我想如果这种情况继续下去,例如几个竞争的箭头包演变,我们可能会看到类似:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib ,. ..
然后我担心如果spoonklink被分叉,Hackage将耗尽磁盘空间。 :)
问题:
答案 0 :(得分:65)
其中一堆几乎完全等同:
mtl
使用GHC扩展,但transformers
是Haskell 98。monads-fd
和monads-tf
是transformers
的附加组件,分别使用功能依赖项和类型系列,两者都提供mtl
中transformers
中缺少的功能mtl-tf
}。mtl
mtl
使用类型系列重新实现。基本上,transformers
== monads-fd
++ mtl-tf
,transformers
== monads-tf
++ transformers
。 {I} mtl
及其相关软件包的可移植性和模块性得到改善,这就是为什么mmtl
这些天不为人所知。
mtlx
和mtl
似乎与MonadLib
相似和/或基于compose-trans
,具有API差异和额外功能。
Control.Monad.Trans
似乎对事情有不同的看法,但我并不直接熟悉它。似乎也使用了很多GHC扩展,比其他扩展更多。
乍一看,mtl
似乎更像是创建monad变换器的元编程。它声称与transformers
兼容......我的意思是mtl
?
无论如何,我建议采用以下决策算法:
mtl
& co。,帮助我们让transformers
休息。category-extras
,用一页<一半的答案 1 :(得分:20)
目前?您应该使用mtl
。发生的事情是,transformers
库以monads-fd
和monads-tf
可以和平共存的方式从MTL中分解出来,但最后检查还不是这样的。
当发生这种情况时,您将能够导入monads-fd
和transformers
并获得(几乎)相同的界面,但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变换器库。