最近的cabal安装将我的transformers版本从0.3.0.0升级到0.4.1.0。通过此升级,出现了有关ErrorT的折旧警告。
文档不清楚这只是重命名还是功能上有变化?为什么要做出这种改变?
答案 0 :(得分:15)
有功能变化。 ErrorT
要求e
类型成为Error
type class的成员 - 例如,考虑其Monad
实例约束。这是相当随意的,当然不需要ErrorT
的功能。
ExceptT
解除了这个限制。
引入重命名是为了创建更平滑的升级途径。当前使用并依赖Error
堆栈中ErrorT
约束的人不应该更改代码。想要使用严格更通用的ExceptT
模块的人可以自由选择这样做。在某些时候,ErrorT
模块可能会被删除。
答案 1 :(得分:3)
语义发生了变化。
ErrorT e m
期望e
在其Error
实例中实现Monad
类。这允许fail
的{{1}}实现抛出异常:
ErrorT e m
相反,fail msg = ErrorT $ return (Left (strMsg msg))
没有做出任何此类限制。相反,ExceptT
fail
的实施会在基础monad ExceptT e m
中调用异常:
m
我更喜欢fail = ExceptT . fail
的行为,因为它允许我捕获通过一般monad上的代码调用ErrorT
的任何实例。在任何情况下,在将fail
重命名为ErrorT
之前检查您的代码非常重要。