vendredi 29 mai 2015

Infinite random sequence loops with randomIO but not with getRandom

I'm having difficulty trying to figure out a way to reason about why the following two, seemingly equivalent definitions of an infinite random number sequence (inf and inf') are evaluated completely differently:

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)

main = do
  i <- evalRandIO inf     -- HANGS
  putStrLn $ show $ take 5 (i :: [Int])

main' = do
  i <- inf'               -- OK
  putStrLn $ show $ take 5 (i :: [Int])

when called, main' terminates and prints 5 random integers, whereas main loops infinitely — what causes sequence . repeat to be evaluated differently on getRandom than it does on randomIO?




Aucun commentaire:

Enregistrer un commentaire