使用MonadError
编写代码时,catchError
可以将失败的计算变为成功的计算。不幸的是,给定的处理程序函数本身可能会失败,因此无法保证结果计算是否成功。我正在考虑逃避MonadError
:
{-# LANGUAGE RankNTypes #-}
safeCatchError' :: Monad m =>
(forall e n. (Error e, MonadError e n) => (n a, e -> m a)) ->
m a
safeCatchError' (c, h) = either h return (c `asTypeOf` Left "e = String")
此版本不涉及变压器堆栈。那么下面的扩展呢?
safeCatchError :: (MonadTrans t, Monad m) =>
(forall e n. (Error e, MonadError e n) => (t n a, e -> t m a)) ->
t m a
可以合理定义此功能吗?如果有,怎么样?如果不是,为什么不呢?还需要哪些额外的假设?可以为t = ReaderT a
定义。