KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
UPDATE: Okay this question becomes potentially very straightforward. q <- mapM return [1..] Why does this never return? Does mapM not lazily deal with infinite lists? The code below hangs. However, if I replace line A by line B, it doesn't hang anymore. Alternatively, if I preceed line A by a "splitRandom $", it also doesn't hang. Q1 is: Is mapM not lazy? Otherwise, why does replacing line A with line B "fix this" code? Q2 is: Why does preceeding line A with splitRandom "solve" the problem? import Control.Monad.Random import Control.Applicative f :: (RandomGen g) => Rand g (Double, [Double]) f = do b <- splitRandom $ sequence $ repeat $ getRandom c <- mapM return b -- A -- let c = map id b -- B a <- getRandom return (a, c) splitRandom :: (RandomGen g) => Rand g a -> Rand g a splitRandom code = evalRand code <$> getSplit t0 = do (a, b) <- evalRand f <$> newStdGen print a print (take 3 b) The code generates an infinite list of random numbers lazily. Then it generates a single random number. By using splitRandom, I can evaluate this latter random number first before the infinite list. This can be demonstrated if I return b instead of c in the function. However, if I apply the mapM to the list, the program now hangs. To prevent this hanging, I have to apply splitRandom again before the mapM. I was under the impression that mapM can lazily
Tags (comma-separated)
Save Edits
Cancel