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(这里是无限次)。