Many Thanks Neil, <br><br>I tried to build hlint before submitting to the mail list but i couldn&#39;t because my haskell-src-exts is version 1.1.1 and the cabal file of hlint requires a version &lt; 1.1. Now i modified the cabal depends and successfully installed hlint, it&#39;s a great tool.<br>


<br clear="all">&quot;Piensa y trabaja&quot; <br><br>Jesús Alberto Sánchez Pimienta<br>Estudiante de la Lic. en Estudios Políticos y Gobierno<br>Universidad de Guadalajara<br><br>
<br><br><div class="gmail_quote">2009/8/16 Neil Mitchell <span dir="ltr">&lt;<a href="mailto:ndmitchell@gmail.com" target="_blank">ndmitchell@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


Hi<br>
<br>
An easy way to get some instant feedback is to run HLint on it:<br>
<a href="http://community.haskell.org/%7Endm/hlint" target="_blank">http://community.haskell.org/~ndm/hlint</a><br>
<br>
The results are:<br>
<br>
C:\Neil\hlint&gt;hlint Example.hs<br>
Example.hs:42:1: Warning: Use liftM<br>
Found:<br>
  readFile p &gt;&gt;= return . lines &gt;&gt;=<br>
    return . map (second tail . break (== &#39;=&#39;) . filter (/= &#39; &#39;))<br>
Why not:<br>
  liftM (map (second tail . break (== &#39;=&#39;) . filter (/= &#39; &#39;)))<br>
    (readFile p &gt;&gt;= return . lines)<br>
<br>
Example.hs:42:1: Warning: Use liftM<br>
Found:<br>
  readFile p &gt;&gt;= return . lines<br>
Why not:<br>
  liftM lines (readFile p)<br>
<br>
Found 2 suggestions<br>
<br>
So using liftM instead of &gt;&gt;= return might be better style.<br>
<br>
You can also make minor tweaks like:<br>
<br>
if null args then readConfig defaultConfig else readConfig (head args)<br>
==&gt;<br>
readConfig $ if null args then defaultConfig else head args<br>
<br>
  currentIP &lt;- catch (getIPAddress webIP) (\e -&gt; syslog Error (show e)<br>
&gt;&gt;  return &quot;0&quot;)<br>
  oldIP &lt;- catch (S.readFile ipCache) (\e -&gt;  syslog Error (show e) &gt;&gt;<br>
return &quot;0&quot;)<br>
==&gt;<br>
let catch_ x = catch x (\e -&gt; syslog Error (show e) &gt;&gt;  return &quot;0&quot;)<br>
currentIP &lt;- catch_ $ getIPAddress webIP<br>
oldIP &lt;- catch_ (S.readFile ipCache)<br>
<br>
And there&#39;s no need to exitSuccess at the end of main, exitSuccess is<br>
the default.<br>
<br>
Thanks<br>
<br>
Neil<br>
<br>
<br>
<br>
<br>
<br>
2009/8/16 Jesús Alberto Sánchez Pimienta &lt;<a href="mailto:jesusalbertosanchez@gmail.com" target="_blank">jesusalbertosanchez@gmail.com</a>&gt;:<br>
<div><div></div><div>&gt; Hello haskellers,<br>
&gt;<br>
&gt; I just finished my first useful haskell program and  I&#39;d be glad if you make<br>
&gt; me some comments<br>
&gt;<br>
&gt; <a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8244#a8244" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8244#a8244</a><br>
&gt;<br>
&gt; Thank you, and sorry for my english.<br>
&gt;<br>
&gt;<br>
&gt; &quot;Piensa y trabaja&quot;<br>
&gt;<br>
&gt; Jesús Alberto Sánchez Pimienta<br>
&gt; Estudiante de la Lic. en Estudios Políticos y Gobierno<br>
&gt; Universidad de Guadalajara<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
&gt;<br>
</blockquote></div><br>