安全catchError?

时间:2015-01-21 13:11:00

标签: haskell error-handling monad-transformers

使用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定义。

0 个答案:

没有答案