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

时间:2017-10-25 11:38:16

标签: haskell monad-transformers

说我有一个功能

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

1 个答案:

答案 0 :(得分:1)

事实证明我可以使用runExceptT

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&#34;陷阱&#34;。另一方面,我不知道如何封装这个runExcept / either throwError模式。