2013-06-20 23 views
6

Dlaczego nie jest konieczne użycie windy do wykonywania funkcji w wewnętrznym środowisku transformatora monad, z wyjątkiem IO? Chodzi mi o to, że jeśli mam STAŁO na pisanie i pisanie na ReaderT, dlaczego mogę to zrobić?Monad Transformatory i funkcja podnoszenia

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

zamiast

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

Czy istnieje specjalny wyjaśnienie czy jest to tylko sposób monady Transformatory zostały napisane?

+3

Spójrz na [wszystkie wystąpienia programu 'WriterT'] (http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i : WriterT). – icktoofay

+1

Należy zauważyć, że jeśli używasz biblioteki 'transformers' zamiast' mtl', będziesz musiał jawnie 'podnieść' wszystko. –

Odpowiedz

7

Dzieje się tak dlatego, że biblioteka Monad Transformer Library (MTL) rozpoznaje, że dość często stosujesz monady w taki sposób, że nie definiują one tell jako tylko niektórych funkcji (Mondoid w) => w -> Writer().

Zamiast tego mają one MonadWriter, który jest zdefiniowany jako typograficzny z tell jako funkcja w nim. Następnie określają masę wystąpień MonadWriter: ReaderT, IO, Writer (duh) itd. W ten sposób unikasz irytujących powtórzeń z lift..

Jest to dość powszechne, każdy transformator monad (w MTL) będzie miał Control.Monad.***.Class, który ma tego rodzaju typeclass.

+0

Rozumiem !, nie przeczytałem przykładów Monad. Dziękuję Ci – Jcao02

Powiązane problemy