这个问题接近其他地方,但我没有找到任何具体解决它的问题(至少不是我能理解的方式)。
我想以一种取决于各种随机选择的方式更新状态。由于我正在使用的RandomSource类型类的实例,所有这些随机选择都存在于IO monad中,如下所示:
main :: IO Int
main = do
a <- pickRand [1..7]
return a
where pickRand lst = runRVar (choice lst) DevRandom
我想做的是如下:存储类型为[Int]的状态,如果随机选择的列表元素a大于3,则将其推入状态。有小费吗?
答案 0 :(得分:4)
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