inf
次の 2 つの一見同等の無限乱数シーケンスの定義 (および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