说我有一个功能
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
答案 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
模式。