Yes, this is much more idiomatic haskell.<br><br><div class="gmail_quote">On Sat, Feb 21, 2009 at 4:59 AM, Thomas Davie <span dir="ltr">&lt;<a href="mailto:tom.davie@gmail.com">tom.davie@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><br><div><div>On 21 Feb 2009, at 01:30, Patrick LeBoutillier wrote:</div><br><blockquote type="cite">
<div>Hi all,<br><br>I&#39;m trying to implement the following simple Perl program in Haskell:<br><br> &nbsp;my $nb_tests = 0 ;<br><br> &nbsp;sub ok {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $bool = shift ;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nb_tests++ ;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print STDOUT ($bool ? &quot;ok&quot; : &quot;nok&quot;) . &quot; $nb_tests\n&quot; ;<br>
 &nbsp;}<br><br> &nbsp;ok(0) ;<br> &nbsp;ok(1) ;<br><br>The output is:<br><br> &nbsp;nok 1<br> &nbsp;ok 2<br><br>I&#39;m pretty much a Haskell newbie, but I know a bit about monads (and<br>have been reading &quot;Real World Haskell&quot;), and I think I need to put the<br>
ok function must live inside some kind of state monad. My problem is<br>that I also would like the ok function to perform some IO (as shown<br>above, print).<br><br>How is a case like this handled? Can my function live in 2 monads?<br>
</div></blockquote></div><br><div>I personally wouldn&#39;t use two monads at all for this  in fact, I&#39;d only use IO in one function:</div><div><br></div><div><div><font face="Monaco" size="3"><span style="font-size:11px">main = putStr . unlines . results inputs . snd . tests $ inputs</span></font></div>
<div><font face="Monaco" size="3"><span style="font-size:11px"><br></span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px">inputs = [1,2]</span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px"><br>
</span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px">tests = foldr (\_ (x,l) -&gt; (not x, x:l)) (True,[])</span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px"><br>
</span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px">results = zipWith result</span></font></div><div><font face="Monaco" size="3"><span style="font-size:11px">result testN True &nbsp;= &quot;ok &quot; &nbsp;++ show testN</span></font></div>
<div><font face="Monaco" size="3"><span style="font-size:11px">result testN False = &quot;nok &quot; ++ show testN</span></font></div><br></div><div>Bob</div></div><br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br>