[Haskell-beginners] RWH Ch. 27 TCP Server Example
Francesco Bochicchio
bieffe62 at gmail.com
Tue Apr 14 23:41:06 EDT 2009
2009/4/14 aditya siram <aditya.siram at gmail.com>
> Hi all,
> I am trying to understand the TCP Syslog Server example [1] from RWH.
> Specifically my question is on this piece of code:
> -- | Process incoming messages
> procMessages :: MVar () -> Socket -> SockAddr -> IO ()
> procMessages lock connsock clientaddr =
> do connhdl <- socketToHandle connsock ReadMode
> hSetBuffering connhdl LineBuffering
> messages <- hGetContents connhdl
> mapM_ (handle lock clientaddr) (lines messages)
> hClose connhdl
> handle lock clientaddr
> "syslogtcpserver.hs: client disconnected"
>
> How does control stay on "mapM_ (handle lock clientaddr) (lines
> messages)" ? It would seem that the server would handle one message
> and immediately close the handle and end - but it doesn't. I'm
> guessing this has something to do with laziness, but I don't see how
> to apply it.
I think you are right thinking about laziness. The function hGetContents
produces a lazy
result (messages), therefore any function that consumes messages could be
considered as 'iteratively calling' hGetContents to get new elements of
messages ...
Laziness is a Very Cool Feature ... when it does not bite you with thunk
accumulation problems :-)
Ciao
------
FB
>
>
> thanks ..
> -deech
>
> [1] http://book.realworldhaskell.org/read/sockets-and-syslog.html
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20090415/66a73b82/attachment.htm
More information about the Beginners
mailing list