Haskell mtl、变形金刚、单子fd、单子IB和选择悖论
Hackage为monad变压器提供了几个软件包:Haskell mtl、变形金刚、单子fd、单子IB和选择悖论,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,Hackage为monad变压器提供了几个软件包: :Monad转换器库 :具体函子和单子变换器 :Monad类,使用函数依赖项 :Monad类,使用类型族 :单子变压器的集合 :使用类型族的Monad转换器库 :模块化Monad转换器库 :带类型索引的Monad transformer库,提供“免费”副本 :可组合单体变压器 (也许我错过了一些) 我们用哪一种 mtl是Haskell平台中的一个,但我一直在reddit上听说它不酷 但不管怎样,选择有什么坏处,它不只是一件好事吗 例如,我看
- :Monad转换器库
- :具体函子和单子变换器
- :Monad类,使用函数依赖项
- :Monad类,使用类型族
- :单子变压器的集合
- :使用类型族的Monad转换器库
- :模块化Monad转换器库
- :带类型索引的Monad transformer库,提供“免费”副本
- :可组合单体变压器
- 数据存取器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中的状态
- 为什么有这么多monad transformer包
- 为什么mtl[被认为]不酷
- 关键区别是什么
- 这些看似相互竞争的软件包大多由安迪·吉尔(Andy Gill)编写,由罗斯·帕特森(Ross Paterson)维护。这是否意味着这些软件包不是相互竞争,而是以某种方式协同工作?安迪和罗斯认为他们自己的包裹是否过时了?
- 你和我应该用哪一个
使用GHC扩展,但是mtl
是Haskell 98transformers
和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差异外,我没有注意到任何问题