Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Monad转换器:IO和state_Haskell - Fatal编程技术网

Haskell Monad转换器:IO和state

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

这个问题接近于其他地方所涉及的领域,但我还没有找到任何具体解决这个问题的方法(至少我无法理解)

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

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