2017-11-24 10 views
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の値を尋ねる

+1

乱数発生器を無限に実行した後の状態はどうですか?私はあなたが 'g1'を手に入れようとしたときに、それが本質的にあなたが求めているものだと信じています。 –

答えて

3

は、基本的に乱数生成器の状態を要求します:それは与え

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

Intリストは無限であるが、それは単一乱数発生状態(署名でg)をバック与えます。これは、リスト内のすべてのInt(ここでは無限回数)を取得するのに十分な時間を実行した後、ジェネレータの状態でなければなりません。

関連する問題