, sen lift
kullanabilirsiniz:
lift :: (MonadTrans t, Monad m) => m a -> t m a
Bu durumda, t
StateT MyState
ve m
MyMonad
olduğunu. Yani, örneğin:
foo :: StateT MyState MyMonad MyType
foo = do
modify $ \s -> s+1
lift $ doSomethingInMyMonad 42
Monad transformatörler Eğer içeriden tip MyMonad MyType
değerini döneceğini anlamda "konulu katmanlı" değildir; Daha fazla literal bir dönüşümü:, bir monad'i dönüştürülmüş monadde eylemleri yürütme yeteneğine sahip yeni bir taneye dönüştürürler. StateT s m
'u sadece State s
monad olarak düşünebilirsiniz, ancak m
'daki eylemleri StateT s m
'daki eylemlere dönüştürmek için lift
'u da kullanabilirsiniz. vb StateT
, ReaderT
gibi standart Monad Transformer Library (mtl) transformatörleri kullanıyorsanız
, gerçekte lift
kullanmak gerekmez; modify
ve ask
gibi şeyler, numaralı herhangi bir monadında, yığındaki bir yere doğru trafo ile çalışır. (Bir yığın StateT s (ReaderT r IO)
gibi, dönüştürülmüş monad'ların sadece kule.)
Ayrıca, altta IO
ile büyük bir yığın varsa, tabakaların herhangi bir sayıda bir IO
eylemi kaldırmak üzere bir kolaylık işlevi vardır:
liftIO :: (MonadIO m) => IO a -> m a
Yani IO
yılında liftIO (putStrLn "Hello, world!")
eserler StateT Int IO
, vb ContT r (WriterT [String] IO)
ve.
(ek not olarak,
foo
burada aslında bir fonksiyonu değildir; daha doğru bir terim
eylem veya
hesaplama içindir.) Eğer hoogle bilmem durumda
: http: // www.haskell.org/hoogle – jberryman