Haskell Monad转换器:IO和state
这个问题接近于其他地方所涉及的领域,但我还没有找到任何具体解决这个问题的方法(至少我无法理解) 我想以一种取决于各种随机选择的方式更新状态。由于我正在使用的RandomSource typeclass的实例,所有这些随机选择都存在于IO monad中,如下所示:Haskell Monad转换器:IO和state,haskell,Haskell,这个问题接近于其他地方所涉及的领域,但我还没有找到任何具体解决这个问题的方法(至少我无法理解) 我想以一种取决于各种随机选择的方式更新状态。由于我正在使用的RandomSource typeclass的实例,所有这些随机选择都存在于IO monad中,如下所示: main :: IO Int main = do a <- pickRand [1..7] return a where pickRand lst = runRVar (ch
main :: IO Int
main = do
a <- pickRand [1..7]
return a
where pickRand lst = runRVar (choice lst) DevRandom
main::IO Int
main=do
a导入控制.Monad
进口管制.单子.跨州
导入控制.Monad.IO.Class
导入Data.Random.RVar
导入Data.Random.Source.DevRandom
导入Data.Random.List
myFun::StateT[Int]IO()
myFun=do
lst>=打印
请阅读有关StateT
monad transformer的内容,至少在某种程度上,我能够找到好的资源。我读到的内容告诉我如何处理与我想要的内容相关的事情,例如如何使用lift$print从状态monad打印。但是我没有一个解决我具体问题的方法。太好了,非常有用。
import Control.Monad
import Control.Monad.Trans.State
import Control.Monad.IO.Class
import Data.Random.RVar
import Data.Random.Source.DevRandom
import Data.Random.List
myFun :: StateT [Int] IO ()
myFun = do
lst <- get
r <- liftIO $ runRVar (randomElement lst) DevRandom
put $ if r > 3 then (r:lst) else lst
return ()
main :: IO ()
main = evalStateT myFun [1..10] >>= print