我很难想出一种方法来解释为什么以下两个看似等效的无限随机数序列 (inf
和inf'
) 的定义被完全不同地评估:
import Control.Monad.Random (Rand, evalRandIO, getRandom)
import System.Random (Random, RandomGen, randomIO)
inf :: (RandomGen g, Random a) => Rand g [a]
inf = sequence (repeat getRandom)
inf' :: (Random a) => IO [a]
inf' = sequence (repeat randomIO)
-- OK
main = do
i <- evalRandIO inf
putStrLn $ show $ take 5 (i :: [Int])
-- HANGS
main' = do
i <- inf'
putStrLn $ show $ take 5 (i :: [Int])
当被调用时,main'
终止并打印 5 个随机整数,而main
无限循环 - 是什么原因导致对它的评估与对它的sequence . repeat
评估不同?getRandom
randomIO