Why this obsession with IO?&nbsp; There should be no IO involved in this, except for getting the initial generator.<br>Using IO just confuses what is going on.<br><br>&nbsp; -- Lennart<br><br><div><span class="gmail_quote">On 7/30/07, 
<b class="gmail_sendername">Cale Gibbard</b> &lt;<a href="mailto:cgibbard@gmail.com">cgibbard@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On 30/07/07, Chad Scherrer &lt;<a href="mailto:chad.scherrer@gmail.com">chad.scherrer@gmail.com</a>&gt; wrote:<br>&gt; I&#39;m trying to do something I thought would be pretty simple, but it&#39;s<br>&gt; giving me trouble.
<br>&gt;<br>&gt; Given a list, say [1,2,3], I&#39;d like to be able to generate an infinite<br>&gt; list of random elements from that list, in this case maybe<br>&gt; [1,2,1,3,2,1,3,2,3,1,2,...]. I&#39;m using IO for random purely due to
<br>&gt; laziness (my own, not Haskell&#39;s).<br>&gt;<br>&gt; I was thinking the best way to do this might be to first write this function:<br>&gt;<br>&gt; randomElts :: [a] -&gt; [IO a]<br>&gt; randomElts [] = []<br>&gt; randomElts [x] = repeat (return x)
<br>&gt; randomElts xs = repeat r<br>&gt;&nbsp;&nbsp; where<br>&gt;&nbsp;&nbsp; bds = (1, length xs)<br>&gt;&nbsp;&nbsp; xArr = listArray bds xs<br>&gt;&nbsp;&nbsp; r = do<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; i &lt;- randomRIO bds<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return (xArr ! i)<br>&gt;<br>&gt; Then I should be able to do this in ghci:
<br>&gt;<br>&gt; &gt; sequence . take 5 $ randomElts [1,2,3]<br>&gt; [*** Exception: stack overflow<br>&gt;<br>&gt; Any idea what&#39;s going on? I thought laziness (Haskell&#39;s, not my own)<br>&gt; would save me on this one.
<br><br>I don&#39;t get that result. However, you can&#39;t compute an infinite random<br>list in IO without using something like unsafeInterleaveIO. However,<br>you will probably be interested in randoms/randomRs, which take a
<br>random generator, and give an infinite list of results.<br><br>Using that, we could write something like:<br><br>randomElts :: [a] -&gt; IO [a]<br>randomElts [] = return []<br>randomElts xs = do g &lt;- newStdGen<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (map (xArr !) (randomRs bds g))
<br> where bds = (1, length xs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xArr = listArray bds xs<br><br>which for a nonempty input list, gives an infinite list of<br>pseudorandom elements of that input list.<br><br> - Cale<br>_______________________________________________
<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe
</a><br></blockquote></div><br>