在“ExceptT”计算中处理不同的错误类型

时间:2017-08-29 11:00:41

标签: haskell error-handling either

(此问题与this question类似,但该问题仅收到推荐errors包的评论,我想了解更多详情。)

我正在开发一个程序,它使用两个不同的包,它们都返回类型IO (Either e a)Either e a。但是,e在库之间并不相同。

我想知道如何构建使用这两个库的函数。我应该使用errors的提示引导我hushnote,但这感觉不太正确:

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中的非均匀错误的一般指针,我将非常感谢(某些)具体问题的答案。

1 个答案:

答案 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 投掷/返回的各种异常。
  • 什么是异常处理程序&#39;几乎总是一样的。