为什么 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 确实提供 actionFinally
和 actionOnException
作为构建块,它们是 MonadMask
中可用功能的受限变体。此外,Shake 提供了 withTempFile
和 withTempDir
,它们做一些与 temporary
包相同的事情。最后,如果您完全处于 IO
,那么 liftIO
和 bracket
可以正常工作。
我想使用 temporary
package with Shake,但这需要 Action
有一个 MonadMask
的实例,但缺少该实例。为什么Shake不提供这样的实例?
有两个原因:
- 这是不可能的,因为
Action
是基于延续 monad 的,你不能为延续 monad 实现MonadMask
。请参阅 this blog post 了解为什么这是不可能的粗略理由。 - 这是不可取的,因为那时你可以根据依赖规则是成功还是失败来做出选择,而在 Shake 中,你所依赖的规则失败总是会导致你失败。
但是,Shake 确实提供 actionFinally
和 actionOnException
作为构建块,它们是 MonadMask
中可用功能的受限变体。此外,Shake 提供了 withTempFile
和 withTempDir
,它们做一些与 temporary
包相同的事情。最后,如果您完全处于 IO
,那么 liftIO
和 bracket
可以正常工作。