getRandom 第二次挂起。为什么?
getRandom hangs the second time around. Why?
以下代码在进入第二个 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
main = do
let g0 = mkStdGen 0
(i,g1) = runRand rgen g0
print i
print "one done"
let (j,_) = runRand rgen g1
print j
基于对这个问题的回答:Infinite random sequence loops with randomIO but not with getRandom 我本以为 getRandom 的懒惰性质会允许这个程序终止。
求g1
的值本质上是求随机数发生器运行无限次后的状态
你可以通过特化 sequence
的类型签名得到这样的想法:
sequence :: [Rand g Int] -> Rand g [Int]
它给出的Int
列表是无限的,但它返回一个单个随机数生成器状态(签名中的g
)。这必须是生成器在 运行 次后的状态足以获取列表中的所有 Int
(这里是无限次)。
以下代码在进入第二个 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
main = do
let g0 = mkStdGen 0
(i,g1) = runRand rgen g0
print i
print "one done"
let (j,_) = runRand rgen g1
print j
基于对这个问题的回答:Infinite random sequence loops with randomIO but not with getRandom 我本以为 getRandom 的懒惰性质会允许这个程序终止。
求g1
的值本质上是求随机数发生器运行无限次后的状态
你可以通过特化 sequence
的类型签名得到这样的想法:
sequence :: [Rand g Int] -> Rand g [Int]
它给出的Int
列表是无限的,但它返回一个单个随机数生成器状态(签名中的g
)。这必须是生成器在 运行 次后的状态足以获取列表中的所有 Int
(这里是无限次)。