, 당신은 lift
를 사용할 수 있습니다
lift :: (MonadTrans t, Monad m) => m a -> t m a
를이 경우, t
는 StateT MyState
이며, m
는 MyMonad
입니다. 따라서, 예를 들어 :
foo :: StateT MyState MyMonad MyType
foo = do
modify $ \s -> s+1
lift $ doSomethingInMyMonad 42
모나드 변압기는 당신이 내부에서 유형 MyMonad MyType
의 값을 반환하려는 의미 "에 계층"되지 않습니다 보다 문자 그대로의 변신입니다 : 변형 된 모나드에서 동작을 수행 할 수있는 새로운 모나드로 변합니다. 따라서 StateT s m
을 State s
모나드로 생각할 수 있습니다. 단 을 사용하면 m
의 차례 동작을 StateT s m
의 동작으로 실행할 수 있습니다. 당신이 등 StateT
, ReaderT
, 같은 표준 Monad Transformer Library (MTL) 변압기를 사용하는 경우
, 당신은 실제로 lift
를 사용할 필요가 없습니다; modify
및 ask
과 같은 항목은 의 모나드에서 작동 할 수 있습니다. (스택 StateT s (ReaderT r IO)
처럼 변형 모나드 단지 타워입니다.)
또한, 당신은 하단에 IO
와 큰 스택이있는 경우, 레이어의 수를 IO
조치를 올려의 편의 기능이있다 :
liftIO :: (MonadIO m) => IO a -> m a
그래서 IO
에서 liftIO (putStrLn "Hello, world!")
작품, StateT Int IO
, 등등 ContT r (WriterT [String] IO)
합니다.
(추가 참고 바와 같이,
foo
여기에 실제로 함수가 아닙니다, 더 정확한 용어는
행동 또는
계산입니다.) 당신이 hoogle 모르는 경우
: HTTP : // www.haskell.org/hoogle – jberryman