Подтвердить что ты не робот

Переход от ErrorT к ExceptT

Недавняя установка cabal обновила мою версию transformers из 0.3.0.0 - 0.4.1.0. С этим обновлением появились предупреждения об ошибках в ErrorT.

Документация не ясна, это просто переименование или есть функциональное изменение? Почему было сделано это изменение?

4b9b3361

Ответ 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.