4

这个问题在其他地方很接近,但我还没有找到任何专门解决它的东西(至少不是以我能够理解的方式)。

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

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

         where pickRand lst = runRVar (choice lst) DevRandom

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

4

1 回答 1

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
于 2013-08-20T17:07:10.053 回答