2009/4/14 aditya siram <aditya.siram@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@haskell.org
http://www.haskell.org/mailman/listinfo/beginners