摇动ErrIO中的操作以执行操作

时间:2019-02-08 23:58:23

标签: shake-build-system

我使用摇动,但我调用的操作在ErrIO中而不在IO monad中。我该如何将这类操作引入Action单子。我可以runErr并获取和Either的值,然后调用throwIOliftIO(取决于结果)。这是推荐的方法吗?

代码可能像这样:

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的实例?

1 个答案:

答案 0 :(得分:0)

预计“摇动”规则将成功产生其承诺的结果,或者失败。在大多数情况下,它调用产生Left或失败值的任何东西都应使用throw / error(或者最好是IO中带有{{ 1}},因此例外发生在不基于评估顺序的特定点上。但是,在某些情况下,子操作失败可能不会使规则失败,例如:

  1. 也许您正在运行测试,并且测试失败是通过记录失败以某种定义明确的方式处理的有效和正确的输出。在许多情况下,可以从更高级别检测到这种故障。
  2. 也许您有两种构建方法,liftIO表示第一种方法失败了,所以您应该尝试第二种方法。

关于Either没有MonadError实例的原因,主要原因是有几个Action类型类,而Shake并不依赖于提供的任何库它们,因此会引入额外的依赖关系。与MonadErrorerror相比,它也不会提供任何明显的好处。