<br><div class="gmail_quote">2008/5/8 Thomas Dinsdale-Young &lt;<a href="mailto:thomas-haskell@d-y.me.uk">thomas-haskell@d-y.me.uk</a>&gt;:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Madoc
wrote:
  <br>
  <div class="gmail_quote"><div class="Ih2E3d"><div bgcolor="#ffffff" text="#000000"><blockquote type="cite"><blockquote type="cite">Given a list of numbers, I want to modify
each of those numbers by adding a
    <br>
random offset. However, each such modified number shall stay within
certain
    <br>
bounds, given by the integers minValue and maxValue. After that, I want
to
    <br>
continue computation with the resulting list of type [Int].
    <br>
  </blockquote>
  <br>
Personally, I&#39;d do something like this, isolate the IO code outside the
algorithm to keep the algorithm pure:
  <br>
  <br>
  <br>
modify&#39; :: Int -&gt; Int -&gt; Int
  <br>
modify&#39; offset a =&nbsp; normalize (a + offset)
  <br>
  <br>
generateInfiniteListOfRandomNumbers :: IO [Int]
  <br>
-- implementation left as an exercise
  <br>
  <br>
main = do
  <br>
&nbsp; randomNumbers &lt;- generateInfiniteListOfRandomNumbers
  <br>
&nbsp; print $ zipWith modify&#39; randomNumbers [0, 200, 400, 600, 800, 1000]
  <br>
</blockquote></div></div><div bgcolor="#ffffff" text="#000000">
I may be wrong, but <tt>generateInfiniteListOfRandomNumbers </tt>won&#39;t
terminate and I think it has to before the next IO action occurs.&nbsp;
(Laziness is great, but I don&#39;t think you can really do lazy IO like
that.)<br>
</div></div></blockquote><div><br>Sure it will.&nbsp; You&#39;re right that you cannot do lazy IO like this, but no lazy IO needs to happen here.&nbsp; The key is that an IO action does not have to be performed in order to generate each element of the list -- one IO action is performed at the beginning to produce a random generator, and then this generator is used (functionally and purely) to produce a lazy infinite list of pseudorandom numbers.&nbsp; For example see the &#39;newStdGen&#39; and &#39;randoms&#39; functions from System.Random.<br>
<br>-Brent<br></div></div>