<br><br><div class="gmail_quote">On Fri, Sep 28, 2012 at 11:01 AM, Greg Fitzgerald <span dir="ltr">&lt;<a href="mailto:garious@gmail.com" target="_blank">garious@gmail.com</a>&gt;</span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
I also tried Control.Parallel.Strategies [2].  While that route works,<br>
I had to use unsafePerformIO.  Considering that IO is for sequencing<br>
effects and my IO operation doesn&#39;t cause any side-effects (besides<br>
hogging a file handle), is this a proper use of unsafePerformIO?<br></blockquote><div><br></div><div>That&#39;s actually a perfectly fine use for unsafePerformIO, since the IO action you are performing is pure and therefore safe (modulo your file handle stuff).</div>
<div><br></div><div>unsafePerformIO is a problem when the IO action being run has side effects and their order of evaluation matters (since unsafePerformIO will cause them to be run in an &quot;unpredictable&quot; order)</div>
<div><br></div><div>One common use for unsafePerformIO is to run a query against an external library.  It has to be done in the IO monad, but it is a &quot;pure&quot; computation insofar as it has no side-effects that matter.  Doing this lets us promote values defined in external libraries to bona fide pure Haskell values.</div>
</div>