在下面的代码中,案例表达看起来与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
可能可以进一步改进,但现在我对结果感到满意