我使用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
也许是相关的问题:为什么没有用于Action
的MonadError
实例
发布于 2019-02-10 21:17:29
Shake规则应该要么成功地产生它所承诺的结果,要么失败。在大多数情况下,应该使用throw
/error
(或者在带有liftIO
的IO
中的理想变体,所以异常发生在特定的点而不是基于计算顺序)将它称为产生Left
或失败值的任何东西转换为异常。然而,在少数情况下,子操作失败可能不会导致规则失败,例如:
Either
指示第一种方法失败了,所以你应该尝试第二种方法。至于为什么Action
没有MonadError
实例,主要原因是有一些Shake类型的类,而MonadError
不依赖于任何提供它们的库,所以它会引入一个额外的依赖项。与error
或liftIO . throwError
相比,它也不会提供任何显著的好处。
https://stackoverflow.com/questions/54601827
复制相似问题