There is the <span style="font-family: courier new,monospace;">void</span> function in Control.Monad:<br><a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:void">http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:void</a><br>
<br>Instead of using <span style="font-family: courier new,monospace;">return ()</span> you can just use <span style="font-family: courier new,monospace;">void processLine</span>.<br><br>Also some people like to use the either function instead of matching on Left/Right. In this case you can also avoid introducing a few names:<br>
<br> <span style="font-family: courier new,monospace;">   let processLine = void $ forkIO $</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">          try (hGetLine sSession) &gt;&gt;= either</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">            (\e -&gt; if isEOFError e <br>             then print e <br>             else ioError e)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            (putStrLn &gt;=&gt; const processLine)</span><br>
<br>On 28 June 2011 12:58, John Ky &lt;<a href="mailto:newhoggy@gmail.com">newhoggy@gmail.com</a>&gt; wrote:<br>&gt; Hi Eric, Ivan,<br>&gt; On 28 June 2011 18:32, Erik de Castro Lopo &lt;<a href="mailto:mle%2Bhs@mega-nerd.com">mle+hs@mega-nerd.com</a>&gt; wrote:<br>
&gt;&gt;<br>&gt;&gt; The hlint program would have flagged both of those and possibly<br>&gt;&gt; others. See:<br>&gt;<br>&gt; Cool!<br>&gt; It didn&#39;t flag either for me, but it recommended replacing ++ (show port)<br>
&gt; with ++ show port, if then else with unless, putStrLn (show x) with print x,<br>&gt; and do stuff with stuff.<br>&gt; All useful to know.<br>&gt; On 28 June 2011 18:16, Ivan Lazar<br>&gt; Miljenovic &lt;<a href="mailto:ivan.miljenovic@gmail.com">ivan.miljenovic@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>&gt;&gt; I don&#39;t think you need all those return () everywhere...<br>&gt;<br>&gt;  <br>&gt; You&#39;re right.  At some point I added it in to (try to) make the compiler<br>&gt; happy, but it must have been or become unnecessary.<br>
&gt; I still need two though because forkIO (and therefore my processLine<br>&gt; function) returns IO ThreadId, but the last line for do notation must be<br>&gt; return () (see below).<br>&gt; On 28 June 2011 18:16, Ivan Lazar<br>
&gt; Miljenovic &lt;<a href="mailto:ivan.miljenovic@gmail.com">ivan.miljenovic@gmail.com</a>&gt; wrote:<br>&gt;&gt;<br>&gt;&gt; And at the end, why do you do &quot;line &lt;- getLine&quot; when you don&#39;t use the<br>&gt;&gt; result?<br>
&gt;<br>&gt; Oh that.  I was trying to figure out a way to terminate by program.  I&#39;ve<br>&gt; now changed it to exit on EOF.<br>&gt; Here is my second attempt.  Is it much better?:<br>&gt;<br>&gt; import Control.Concurrent<br>
&gt; import Control.Exception<br>&gt; import Control.Monad<br>&gt; import Network<br>&gt; import System.IO<br>&gt; import System.IO.Error (isEOFError)<br>&gt; main = withSocketsDo $ do<br>&gt;   sListen &lt;- listenOn (PortNumber 8000)<br>
&gt;   putStrLn &quot;Listening on Port 8000&quot;<br>&gt;   forkIO $ forever $ do<br>&gt;     (sSession, hostname, port) &lt;- accept sListen<br>&gt;     putStrLn (&quot;Connected to &quot; ++ hostname ++ &quot;:&quot; ++ show port)<br>
&gt;     let processLine = forkIO $ do<br>&gt;         lineResult &lt;- try (hGetLine sSession)<br>&gt;         case lineResult of<br>&gt;           Right line -&gt; do<br>&gt;             putStrLn line<br>&gt;             processLine<br>
&gt;             return ()<br>&gt;           Left e -&gt; if isEOFError e<br>&gt;             then print e<br>&gt;             else ioError e<br>&gt;     processLine<br>&gt;     return()<br>&gt;   putStrLn &quot;Press &lt;CTRL-D&gt; to quit.&quot;<br>
&gt;   let processStdIn = do<br>&gt;       lineResult &lt;- try getLine<br>&gt;       case lineResult of<br>&gt;         Right line -&gt; processStdIn<br>&gt;         Left e -&gt; unless (isEOFError e) $ ioError e<br>&gt;   processStdIn<br>
&gt;<br>&gt; Thanks for the suggestions.<br>&gt; Cheers,<br>&gt; -John<br>&gt;<br>&gt; _______________________________________________<br>&gt; Haskell-Cafe mailing list<br>&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>&gt;<br>&gt;<br><br>