1
次のコードは、2番目のrunRandに到達するとハングします。どうして?この質問への回答に基づいてgetRandomはもう一度ハングします。どうして?
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の怠惰な性質を期待しているだろう。それは時代
無限の数のためにあなたがsequence
の型シグネチャを専門とするからこれが事実であるという考えを得ることができます実行した後g1
の値を尋ねる
乱数発生器を無限に実行した後の状態はどうですか?私はあなたが 'g1'を手に入れようとしたときに、それが本質的にあなたが求めているものだと信じています。 –