我有一个一元计算。在某些时候,由于 monadic 模式匹配,它开始需要 MonadFail 约束。
我的简单解决方法是用这个运行它:
fmap (either error id) . runErrorT
Run Code Online (Sandbox Code Playgroud)
然而哎哟:
Deprecated: "Use Control.Monad.Trans.Except instead"
Run Code Online (Sandbox Code Playgroud)
所以它似乎已ErrorT被弃用,我要使用它ExceptT。从外面看这听起来不错,但似乎 ExceptT 根本不是替代品! 看看实例声明:
instance (Monad m, Error e) => MonadFail (ErrorT e m)
instance MonadFail m => MonadFail (ExceptT e m)
Run Code Online (Sandbox Code Playgroud)
ErrorT 提供MonadFail 实现。 ExceptT只是举起它。
我不太确定从哪里开始。
我的代码最终不会有可反驳的绑定。这是静态已知可以工作但尚未向类型检查器证明的情况之一。我会到达那里,但需要一些时间。(比如,我将需要依赖类型,所以我需要学习依赖类型。这需要一段时间。)
但与此同时,我的代码需要绑定,error如果我搞砸了,我真的可以被调用。
看起来我正在寻找的是一些通用MonadFail实现,它允许我......好吧,用不匹配的模式做我想做的事。 ErrorT做了这个,ExceptT没有。
我的非弃用选项是什么?
haskell ×1