К лучшему или к худшему, 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?