【问题标题】:getRandom hangs the second time around. Why?getRandom 第二次挂起。为什么?
【发布时间】:2017-11-24 23:06:16
【问题描述】:

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

标签: haskell random lazy-evaluation


【解决方案1】:

询问g1 的值本质上是询问随机数生成器运行无限次后的状态

你可以通过专门化sequence的类型签名来了解这种情况:

sequence :: [Rand g Int] -> Rand g [Int]

它给出的Int 列表是无限的,但它会返回一个单个 随机数生成器状态(签名中的g)。这必须是生成器在运行足够多次以获取列表中的所有Ints 后的状态(这里是无限次)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多