我使用了shake,但我调用的操作是在ErrIO 中而不是在IO monad 中。我怎样才能将这样的操作提升到Actionmonad 中。我可以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
也许相关的问题:为什么没有MonadErrorfor 的实例Action?