Jestem obecnie budowa nowego API, a jedna z funkcji dostarcza obecnie brzmi:Czy powinienem preferować MonadUnliftIO lub MonadMask dla funkcji bracketingu?
inSpan :: Tracer -> Text -> IO a -> IO a
szukam aby przenieść Tracer
do monady, dając mi podpis bardziej jak
inSpan :: MonadTracer m => Text -> m a -> m a
realizacja inSpan
wykorzystuje bracket
, co oznacza, że mają dwie główne opcje:
class MonadUnliftIO m => MonadTracer m
lub
class MonadMask m => MonadTracer m
Ale co powinienem wybrać? Zauważ, że mam kontrolę nad wszystkimi typami, o których wspomniałem, co powoduje, że jestem lekko pochylony w kierunku MonadMask
, ponieważ nie wymusza to od dołu (to znaczy, że możemy mieć czystą instancję MonadTracer
).
Czy jest coś jeszcze, co powinienem wziąć pod uwagę?