我使用摇动,但我调用的操作在ErrIO中而不在IO monad中。我该如何将这类操作引入Action
单子。我可以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
为何没有Action
的实例?
答案 0 :(得分:0)
预计“摇动”规则将成功产生其承诺的结果,或者失败。在大多数情况下,它调用产生Left
或失败值的任何东西都应使用throw
/ error
(或者最好是IO
中带有{{ 1}},因此例外发生在不基于评估顺序的特定点上。但是,在某些情况下,子操作失败可能不会使规则失败,例如:
liftIO
表示第一种方法失败了,所以您应该尝试第二种方法。关于Either
没有MonadError
实例的原因,主要原因是有几个Action
类型类,而Shake并不依赖于提供的任何库它们,因此会引入额外的依赖关系。与MonadError
或error
相比,它也不会提供任何明显的好处。