繁体   English   中英

我们如何与 2 个具有 2 种不同错误类型的 MonadError 约束进行交互?

[英]How can we interact with 2 MonadError constraints having 2 different error types?

说我有一个功能

function1 :: (MonadError String m, MonadIO m) => m Int

function2 :: (MonadError Int m, MonadIO m) => m Int

和一个将Int转换为String的函数

renderException :: Int -> String

有没有办法实现function3,即重用所有3个功能?

function3 :: (MonadError String m, MonadIO m) => m Int
-- add the results from function1, function2 and 
-- transform function2 error into a String

事实证明,我可以使用runExceptT

-- runExceptT :: ExceptT e m a -> m (Either e a)
function3 :: (MonadError String m, MonadIO m) => m Int
function3 =
  do ei <- runExceptT function1
     a  <- either (throwError . show) pure ei
     b  <- function2
     return (a + b)

所以有办法摆脱MonadError e “陷阱”。 另一方面,我不知道如何封装这个runExcept / either throwError模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM