首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将ErrIO中的操作提升为抖动中的操作

将ErrIO中的操作提升为抖动中的操作
EN

Stack Overflow用户
提问于 2019-02-09 07:58:23
回答 1查看 34关注 0票数 0

我使用shake,但我调用的操作是在ErrIO中,而不是在IO monad中。如何才能将这些操作提升到Action monad中。我可以获取runErrEither值,然后调用throwIOliftIO (取决于结果)。这是推荐的方法吗?

代码可能如下所示:

代码语言:javascript
运行
复制
runErr2action :: ErrIO a -> Action a
runErr2action op = liftIO $ do
    res <- runErr  op
    case res of
        Left msg -> throw msg
        Right a -> return a

也许是相关的问题:为什么没有用于ActionMonadError实例

EN

回答 1

Stack Overflow用户

发布于 2019-02-10 21:17:29

Shake规则应该要么成功地产生它所承诺的结果,要么失败。在大多数情况下,应该使用throw/error (或者在带有liftIOIO中的理想变体,所以异常发生在特定的点而不是基于计算顺序)将它称为产生Left或失败值的任何东西转换为异常。然而,在少数情况下,子操作失败可能不会导致规则失败,例如:

  1. 也许您正在运行一个测试,而测试失败是一个有效且正确的输出,您可以通过记录失败来以某种定义良好的方式来处理它。在许多情况下,这样的失败会在更高的级别上被检测到。
  2. 也许你有两种方法来构建某些东西,而Either指示第一种方法失败了,所以你应该尝试第二种方法。

至于为什么Action没有MonadError实例,主要原因是有一些Shake类型的类,而MonadError不依赖于任何提供它们的库,所以它会引入一个额外的依赖项。与errorliftIO . throwError相比,它也不会提供任何显著的好处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54601827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档