Haskell getRandom第二次挂起。为什么?

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

下面的代码在到达第二个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
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
时所要求的。