2013-06-20 4 views
6

Почему нет необходимости использовать лифт для выполнения функции во внутренней среде трансформатора монады, кроме IO? Я имею в виду, если у меня есть StateT над WriterT и WriterT над ReaderT, почему я могу это сделать?Monad Трансформаторы и функция подъема

tell $ {- any code here for the Writer -} 
foo <- asks {- This for the reader -} 
and so on... 

вместо

lift $ tell $ {- code ... -} 
... 

Есть ли специальное объяснение или это только способ монады Трансформаторы были написаны?

+3

Посмотрите на [все экземпляры 'WriterT'] (http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i : WriterT). – icktoofay

+1

Обратите внимание, что если вы используете библиотеку 'transformers' вместо' mtl', вам придется явно «поднять» все. –

ответ

7

Это потому, что Monad Transformer Library (MTL) признает, что для вас довольно часто складывать монады таким образом, чтобы они не определяли tell как функцию только (Mondoid w) => w -> Writer().

Вместо этого у них есть MonadWriter, который определяется как a typeclass with tell as a function in it. Затем они определяют тонну экземпляров MonadWriter: ReaderT, IO, Writer (duh) и т. Д. И таким образом вы избегаете раздражающего повторения lift..

Это обычное явление, любой трансформатор монады (в MTL) будет иметь Control.Monad.***.Class, у которого есть этот тип класса.

+0

Я понимаю! Я не читал экземпляры Монад. спасибо – Jcao02

Смежные вопросы