如何在涉及IO和IO的代码中使用fmap/bint而不是情况

  • 本文关键字:IO bint fmap 情况 代码 haskell
  • 更新时间 :
  • 英文 :


在下面的代码中,案例表达看起来与Either的绑定实现相似。

doConfirmation :: Registration -> IO (Either Text ())
findRegistration :: Text -> DbData -> Either Text Registration
dbData <- readTVarIO db
case findRegistration rid dbData of
  Right r -> doConfirmation r
  Left err -> return $ Left err

我该如何编写它来利用它,而不是在发生错误的情况下明确地 return Left

遵循评论并阅读了一些有关Haskell中的异常处理的阅读,我做了以下操作:

我将潜在失败的非IO功能从Either Text a更改为Either MyException a

然后,我将IO功能从IO (Either e a)更改为简单的IO a,因为无论如何IO中都存在异常。

然后我还添加了raise辅助功能。

这使代码不错且干净。请参阅下面:

raise :: Exception e => Either e a -> IO a
raise = either throwIO return
doConfirmation :: Registration -> IO ()
findRegistration :: Text -> DbData -> Either RegistrationException Registration
readTVarIO
>>= raise . findRegistration rid
>>= doConfirmation

可能可以进一步改进,但现在我对结果感到满意

最新更新