我能逃脱`catch`中的`IO`吗?

时间:2018-10-01 12:38:03

标签: haskell

这是给您的类型难题。所以我们有

s3:CreatedObject:*

我是否可以在处理程序中安全地逃脱catch :: Exception e => IO a -> (e -> IO a) -> IO a 。我对签名类似于以下功能的功能感兴趣:

IO

这明智吗?还是我看错了?

一些其他上下文:我的问题是我正在使用一个在catchM :: Exception e => MonadIO io => MonadError e io => IO a -> (e -> io a) -> io a 中引发异常的库。我包装了其中一些功能,并将其提升到我自己的monad中(使用IO)。我希望能够捕获该库可以在我称为提供的提升版本的地方抛出的一些功能。另外,当我捕获到异常时,我想将它们重新抛出到我自己的错误处理框架中。

1 个答案:

答案 0 :(得分:8)

-- Note that MonadError e io is unnecessary.
catchM :: (Exception e, MonadIO io) => IO a -> (e -> io a) -> io a
catchM m h = do
  r <- liftIO (try m)
  case r of
    Left e -> h e
    Right a -> pure a