我使用了shake,但我调用的操作是在ErrIO 中而不是在IO monad 中。我怎样才能将这样的操作提升到Action
monad 中。我可以runErr
获取并Either
赋值,然后调用throwIO
或liftIO
(取决于结果)。这是推荐的方法吗?
代码可能是这样的:
runErr2action :: ErrIO a -> Action a
runErr2action op = liftIO $ do
res <- runErr op
case res of
Left msg -> throw msg
Right a -> return a
也许相关的问题:为什么没有MonadError
for 的实例Action
?