<div>Hi all,</div><div><br></div><div>I&#39;m practising my Haskell by writing a simple TCP echo server and finding that getting my program control to be succinct is rather tricky.  In particular, I <font class="Apple-style-span" face="&#39;courier new&#39;, monospace">have <font class="Apple-style-span" color="#009900">return ()</font></font> everywhere, my error handling is verbose and I&#39;m not entirely sure my recursion is the cleanest way syntactically to get my loops going and terminating.</div>
<div><br></div><div>I must be doing something obviously un-Haskell-like.</div><div><br></div><div>Any suggestions on how I can improve my code?  Code below.</div><div><br></div><div>Cheers,</div><div><br></div><div>-John</div>
<div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Concurrent</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Exception</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Monad</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Network</font></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace; ">import System.IO</span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import System.IO.Error (isEOFError)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">main = withSocketsDo $ do</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  sListen &lt;- listenOn (PortNumber 8000)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  putStrLn &quot;Listening on Port 8000&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  forkIO $ forever $ do</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    (sSession, hostname, port) &lt;- accept sListen</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    putStrLn (&quot;Connected to &quot; ++ hostname ++ &quot;:&quot; ++ (show port))</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    let processLine = forkIO $ do</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        lineResult &lt;- try (hGetLine sSession)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        case lineResult of</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">          Right line -&gt; do</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            putStrLn line</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            processLine</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            return ()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">          Left e -&gt;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            if isEOFError e</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                then putStrLn (show e)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                else do</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                  ioError e</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                  return ()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        return ()</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    processLine</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    return()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  line &lt;- getLine</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  return ()</font></div></blockquote><div><br></div>