Я читал this question. Вот цитата из принятого ответа:Должен ли я использовать монад или конвертер mont traformer?
Этот экземпляр был добавлен в базовой 4.3.xx, который поставляется с GHC 7. Между тем, вы можете использовать экземпляр
Either
непосредственно, или, если вы используетеEither
представлять что-то это может не сработать, вы должны использовать трансформатор monadErrorT
.
Я хочу использовать Either
что-то вроде этого:
> (Left "bad thing happened") >>= \x -> Right (x ++ " ...")
Left "bad thing happened"
Так что, если одна часть вычислений не удается, его Left
возвращается.
Актуальный вопрос: зачем использовать ErrorT
monad transformer вместо Either
monad? Я новичок в Haskell, и я немного боюсь трансформаторов монады, особенно когда я уже пишу код внутри одного.
Ну, в вашем примере мы должны использовать трансформатор монады, потому что IO monad является односторонней монадой. Есть ли трансформатор «EitherT»? «ExceptT» работает как 'EitherT'? – Mark
Я понимаю, что ExceptT является EitherT, который «благословлен», будучи в трансформаторах и mtl. Я не знаю, почему EitherT является аутсайдером, но мне больше нравится ExceptT. – user239558
@Mark На практике я, вероятно, в конечном итоге использовал бы «EitherT» из [любого пакета] (http://haddocks.fpcomplete.com/fp/7.8/20140916-162/either/Control-Monad-Trans-Either.html), так как это было дольше. Эти два функционально эквивалентны. Я ссылался на «ExceptT» в своем ответе, поскольку он также исходит от «трансформаторов», и это то, что «ErrorT» устарело в пользу. –