2014-10-14 4 views
2

Я читал this question. Вот цитата из принятого ответа:Должен ли я использовать монад или конвертер mont traformer?

Этот экземпляр был добавлен в базовой 4.3.xx, который поставляется с GHC 7. Между тем, вы можете использовать экземпляр Either непосредственно, или, если вы используете Either представлять что-то это может не сработать, вы должны использовать трансформатор monad ErrorT.

Я хочу использовать Either что-то вроде этого:

> (Left "bad thing happened") >>= \x -> Right (x ++ " ...") 
Left "bad thing happened" 

Так что, если одна часть вычислений не удается, его Left возвращается.

Актуальный вопрос: зачем использовать ErrorT monad transformer вместо Either monad? Я новичок в Haskell, и я немного боюсь трансформаторов монады, особенно когда я уже пишу код внутри одного.

ответ

4

Я бы рекомендовал использовать Either, если он подходит вашему делу. Пример того, где он не быть достаточно, если вы хотите, чтобы выполнить некоторые IO в середине вашего вычисления, например:

x <- mightReturnLeft 
y <- liftIO someIOAction 
useXandY x y 

В этом случае Either не является достаточным, но ErrorT будет работать ,

Кроме того, я бы рекомендовал использовать ExceptT вместо ErrorT. ErrorT полагается на класс Error, который делает его более удобным.

+0

Ну, в вашем примере мы должны использовать трансформатор монады, потому что IO monad является односторонней монадой. Есть ли трансформатор «EitherT»? «ExceptT» работает как 'EitherT'? – Mark

+0

Я понимаю, что ExceptT является EitherT, который «благословлен», будучи в трансформаторах и mtl. Я не знаю, почему EitherT является аутсайдером, но мне больше нравится ExceptT. – user239558

+0

@Mark На практике я, вероятно, в конечном итоге использовал бы «EitherT» из [любого пакета] (http://haddocks.fpcomplete.com/fp/7.8/20140916-162/either/Control-Monad-Trans-Either.html), так как это было дольше. Эти два функционально эквивалентны. Я ссылался на «ExceptT» в своем ответе, поскольку он также исходит от «трансформаторов», и это то, что «ErrorT» устарело в пользу. –