Monad变形金刚:IO和州

时间:2013-08-20 15:37:42

标签: haskell

这个问题接近其他地方,但我没有找到任何具体解决它的问题(至少不是我能理解的方式)。

我想以一种取决于各种随机选择的方式更新状态。由于我正在使用的RandomSource类型类的实例,所有这些随机选择都存在于IO monad中,如下所示:

main :: IO Int
main = do
         a <- pickRand [1..7]
         return a

         where pickRand lst = runRVar (choice lst) DevRandom

我想做的是如下:存储类型为[Int]的状态,如果随机选择的列表元素a大于3,则将其推入状态。有小费吗?

1 个答案:

答案 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