1
我很難找出一種方式來解釋爲什麼以下兩個看似等效的無限隨機數序列(inf
和inf'
)的定義完全不同:無限隨機序列循環與randomIO但不與getRandom
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
評估?
你的意思是'main'終止和'main''掛起? –
@AndrásKovács是的,正好。 –
這兩者之間有一個重要的區別。 ''evalRandIO'使用'IO'來獲得初始化的生成器,從中生成一個無限列表,不需要更多的IO。 'randomIO'需要對每個隨機數字進行'IO'調用,所以當它試圖返回無限列表時,它會掛起(除非使用'unsaveInterleaveIO')。 – cchalmers