我目前正在建设一个新的API,以及它目前提供的功能之一是:我应该更喜欢MonadUnliftIO还是MonadMask来支持类似的功能?
inSpan :: Tracer -> Text -> IO a -> IO a
我期待的是Tracer
进入一个单子,让我签名更像
inSpan :: MonadTracer m => Text -> m a -> m a
的inSpan
实现使用bracket
,这意味着我有两个主要选择:
class MonadUnliftIO m => MonadTracer m
或
class MonadMask m => MonadTracer m
但我应该更喜欢哪个?请注意,我控制了我提到的所有类型,这使我略微倾向于MonadMask
,因为它不会在底部强制执行IO
(也就是说,我们可能有一个纯粹的MonadTracer
实例)。
还有什么我应该考虑的吗?