从ErrorT过渡到ExceptT

时间:2014-09-13 05:58:44

标签: haskell monad-transformers

最近的cabal安装将我的transformers版本从0.3.0.0升级到0.4.1.0。通过此升级,出现了有关ErrorT的折旧警告。

文档不清楚这只是重命名还是功能上有变化?为什么要做出这种改变?

2 个答案:

答案 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之前检查您的代码非常重要。