К лучшему или к худшему, Haskell популярная библиотека Servant сделала ее обычной для запуска кода в стеке монадного трансформатора, ExceptT err IO. Брат владельца-владельца-обработчика ExceptT ServantErr IO. Как утверждают многие, это несколько неудобная монада для работы, поскольку существует множество способов для развёртывания: 1) через обычные исключения из IO в базе, или 2), возвращая Left.
Как Ed Kmett exceptions библиотека полезно разъясняет:
Моноды на основе продолжения и стеки, такие как
ErrorT e IO, которые обеспечивают множественные режимы отказа, являются недопустимыми экземплярами этого класса [MonadMask].
Это очень неудобно, так как MonadMask дает нам доступ к полезной [полиморфной версии] функции bracket для выполнения управления ресурсами (не утечка ресурсов из-за исключения и т.д.). Но в монаде-слуге Handler мы не можем его использовать.
Я не очень хорошо знаком с этим, но некоторые люди говорят, что решение состоит в использовании monad-control, и многие библиотеки-партнеры, такие как lifted-base и lifted-async, чтобы предоставить вашему монаде доступ к инструментам управления ресурсами, например bracket (возможно, это работает и для ExceptT err IO и для друзей?).
Однако, кажется, что monad-control проигрывает в сообществе, но я не могу сказать, какой будет альтернатива. Даже недавняя библиотека safe-exceptions Snoyman использует библиотеку Kmett exceptions и избегает monad-control.
Может ли кто-нибудь прояснить текущую историю для таких людей, как я, которые пытаются вспахать наш путь в серьезное использование Haskell?