(此问题与this question类似,但该问题仅收到推荐errors
包的评论,我想了解更多详情。)
我正在开发一个程序,它使用两个不同的包,它们都返回类型IO (Either e a)
或Either e a
。但是,e
在库之间并不相同。
我想知道如何构建使用这两个库的函数。我应该使用errors
的提示引导我hush
和note
,但这感觉不太正确:
data MyError = Error1 | Error2 | Error3
f :: IO (Either MyErrorType Text)
f = do
now <- someIoAction
runExceptT $ do
x <- note Error1 $ hush LibraryA.f
y <- ExceptT $ note Error2 . hush <$> LibraryB.IO.f
z <- ExceptT $ note Error3 . hush <$> LibraryB.IO.g
pure (x, y, z)
一个结构代码应该如何?我应该匹配结果并转换错误类型吗?我应该知道errors
包中还有其他什么吗?对于如何构造如上所述的代码以及处理Haskell中的非均匀错误的一般指针,我将非常感谢(某些)具体问题的答案。
答案 0 :(得分:0)
如果您只想处理一次错误,我会使用这样的效用函数将Rc
转换为Boo
:
IO (Either e a)
这看起来很危险,但在某些(非常常见的,IMO)案例中它很有用:
IO a
或某些throwWhenLeft :: Exception e => IO (Either e a) -> IO a
throwWhenLeft io = either throwIO return =<< io
投掷/返回的各种异常。