Переход от ErrorT к ExceptT
Недавняя установка cabal обновила мою версию transformers из 0.3.0.0 - 0.4.1.0. С этим обновлением появились предупреждения об ошибках в ErrorT.
Документация не ясна, это просто переименование или есть функциональное изменение? Почему было сделано это изменение?
Ответы
Ответ 1
Существует функциональное изменение. ErrorT
требует, чтобы тип e
был членом класса Error
для пример, рассмотрим его ограничения экземпляра Monad
. Это довольно произвольно и, конечно, не требуется для функциональности ErrorT
.
ExceptT
отменяет это ограничение.
Переименование было введено для того, чтобы создать более плавный путь обновления. Люди, которые в настоящее время используют и зависят от ограничения Error
в своих столах ErrorT
, не должны менять код. Люди, которые хотели бы использовать более общий ExceptT
модуль, могут свободно выбирать это. В какой-то момент модуль ErrorT
может быть удален.
Ответ 2
В семантике есть изменение.
ErrorT e m
ожидает, что e
реализует класс Error
в своем экземпляре Monad
. Это позволяет реализовать fail
для ErrorT e m
для исключения:
fail msg = ErrorT $ return (Left (strMsg msg))
Напротив, ExceptT
не делает такого ограничения. Вместо этого реализация fail
для ExceptT e m
вызывает исключение в базовой монаде m
:
fail = ExceptT . fail
Я предпочитаю поведение ErrorT
, так как он позволяет мне поймать любой экземпляр, где fail
вызывается кодом через общую монаду. В любом случае важно пересмотреть свой код перед тем, как перетащить переименование ErrorT
в ExceptT
.