我有一个单子计算。由于单峰模式匹配,它开始需要MonadFail约束。
我的简单解决方法是使用此代码运行它:
fmap (either error id) . runErrorT
但哦:
Deprecated: "Use Control.Monad.Trans.Except instead"
看来ErrorT
已过时,我改用ExceptT
。从外部听起来还不错,但看起来好像不是ExceptT完全替代了!只需看一下实例声明即可:
instance (Monad m, Error e) => MonadFail (ErrorT e m)
instance MonadFail m => MonadFail (ExceptT e m)
ErrorT
提供 MonadFail实现。 ExceptT
只是提起它。
我不太确定从这一点出发。
我的代码最终根本没有可重命名的绑定。这是静态已知的一种情况,但尚未得到类型检查器的证明。我会到达那儿,但是要花一点时间。 (就像,我将需要依赖类型,所以我将需要学习依赖类型。这需要一段时间。)
与此同时,我的代码需要绑定,如果我搞砸了,我真的可以调用error
。
看来,我正在寻找的是某种通用的MonadFail
实现,该实现允许我…好吧,在模式不匹配的情况下执行我想做的事情。 ErrorT
做到了,ExceptT
没有做到。
我不赞成使用哪些选项?