0

putforM_内でStateTモナドに取り組むにはどうすればよいですか?

loop :: Integer -> StateT World IO ()
loop passes = do
    (scene, b1) <- get
    forM_ [1..passes] $ \pass -> do
        let b2 = foo b1 pass
        -- other stuff --
        put (scene, b2) -- this no longer puts into the StateT monad 

それとも、一緒にもっと良いアプローチがありますか?

4

1 に答える 1

1

私はそれがうまくいくと思います、例えば:

--I don't know what World is so I can't use your example

loop :: StateT Integer IO ()
loop = do
    forM_ [1..10] put
    x <- get
    liftIO $ print x

私が期待するようにevalStateT loop 0プリントを実行します。ボンネットの下でこれを行います:10mapM_

  1. 実際にマップを実行します。上記の例では、リストが返されます。[StateT Integer IO ()]

  2. 次のように右に折ります。foldr (>>) (return ()) listOfMappedValues

あなたが何を期待しているのかは明確ではありませんが、これにより、mapM_

于 2013-01-07T01:23:01.550 に答える