Haskell getRandom第二次挂起。为什么?
下面的代码在到达第二个runRand时挂起。为什么?Haskell getRandom第二次挂起。为什么?,haskell,random,lazy-evaluation,Haskell,Random,Lazy Evaluation,下面的代码在到达第二个runRand时挂起。为什么? import Control.Monad.Random (Rand, getRandom, runRand) import System.Random (RandomGen, mkStdGen) rgen :: (RandomGen g) => Rand g [Int] rgen = do r <- sequence (repeat getRandom) return $ take 5 r mai
import Control.Monad.Random (Rand, getRandom, runRand)
import System.Random (RandomGen, mkStdGen)
rgen :: (RandomGen g) => Rand g [Int]
rgen = do
r <- sequence (repeat getRandom)
return $ take 5 r
main = do
let g0 = mkStdGen 0
(i,g1) = runRand rgen g0
print i
print "one done"
let (j,_) = runRand rgen g1
print j
import Control.Monad.Random(Rand、getRandom、runRand)
导入系统.Random(RandomGen,mkStdGen)
rgen::(RandomGen g)=>兰德g[Int]
rgen=do
r询问g1的值本质上是询问随机数生成器运行无限次后的状态
通过专门化序列的类型签名
,您可以了解这种情况:
sequence :: [Rand g Int] -> Rand g [Int]
它给出的Int
列表是无限的,但它返回一个随机数生成器状态(签名中的g
)。这必须是生成器运行足够多次后的状态,以获取列表中的所有Int
s(此处为无限次)。随机数生成器运行无限次后的状态是什么?我相信这正是您在尝试获得g1
时所要求的。