为什么 Shake 不为 Action 提供 MonadMask 实例?

Why does Shake not provide a MonadMask instance for Action?

我想使用 temporary package with Shake,但这需要 Action 有一个 MonadMask 的实例,但缺少该实例。为什么Shake不提供这样的实例?

有两个原因:

  • 这是不可能的,因为 Action 是基于延续 monad 的,你不能为延续 monad 实现 MonadMask。请参阅 this blog post 了解为什么这是不可能的粗略理由。
  • 这是不可取的,因为那时你可以根据依赖规则是成功还是失败来做出选择,而在 Shake 中,你所依赖的规则失败总是会导致你失败​​。

但是,Shake 确实提供 actionFinallyactionOnException 作为构建块,它们是 MonadMask 中可用功能的受限变体。此外,Shake 提供了 withTempFilewithTempDir,它们做一些与 temporary 包相同的事情。最后,如果您完全处于 IO,那么 liftIObracket 可以正常工作。