Tôi hiện đang xây dựng một API mới, và một trong những chức năng nó hiện đang cung cấp là:Tôi có nên sử dụng MonadUnliftIO hoặc MonadMask cho các chức năng giống như nước lợ không?
inSpan :: Tracer -> Text -> IO a -> IO a
Tôi đang tìm để di chuyển mà Tracer
thành một đơn nguyên, đem lại cho tôi một chữ ký giống như
inSpan :: MonadTracer m => Text -> m a -> m a
Việc thực hiện inSpan
sử dụng bracket
, có nghĩa là tôi có hai lựa chọn chính:
class MonadUnliftIO m => MonadTracer m
hoặc
class MonadMask m => MonadTracer m
Nhưng tôi nên thích điều gì? Lưu ý rằng tôi kiểm soát tất cả các loại tôi đã đề cập, điều này làm cho tôi hơi nghiêng về phía MonadMask
vì nó không thực thi IO
ở dưới cùng (có nghĩa là, chúng tôi có thể có trường hợp MonadTracer
thuần túy).
Tôi có nên cân nhắc điều gì khác không?