StateT
Stateモナドのモナド変換子
型
code:haskell
StateT s m a
s : 状態
m : ベースのモナド
a : 計算結果
e.g.
code:haskell
StateT Int IO String
runStateT :: StateT s m a -> s -> m (a,s)
StateTから内部関数を取り出す
mは任意のモナド
例えば、mをIOモナドだとすると、StateTにrunstateTを作用させると、IOモナドが返ってくる
e.g.: StateT + IO
code:haskell
import Control.Monad.State
type App = StateT Int IO
ここで
状態:Int(カウンタ)
副作用:IO
code:haskell
tick :: App ()
tick = modify (+1)
printCount :: App ()
printCount = do
n <- get
liftIO $ print n
今はStateの世界にいるので、下のモナド (IO)を使うときはliftを使う
code:haskell
liftIO $ putStrLn "hello"
実行
code:haskell
main :: IO ()
main = do
(_, final) <- runStateT app 0
print final