Je suis actuellement la construction d'une nouvelle API, et l'une des fonctions qu'il fournit actuellement est:Dois-je préférer MonadUnliftIO ou MonadMask pour les fonctions de bracketing?
inSpan :: Tracer -> Text -> IO a -> IO a
Je cherche à déplacer que Tracer
dans une monade, me donner une signature plus comme
inSpan :: MonadTracer m => Text -> m a -> m a
La mise en œuvre de inSpan
utilise bracket
, ce qui signifie que j'ai deux options principales:
class MonadUnliftIO m => MonadTracer m
ou
class MonadMask m => MonadTracer m
Mais que dois-je préférer? Notez que je contrôle tous les types que j'ai mentionnés, ce qui me fait légèrement pencher vers MonadMask
car il n'applique pas IO
en bas (c'est-à-dire que nous pourrions avoir une instance MonadTracer
pure).
Y a-t-il autre chose que je devrais considérer?