
2009/4/14 aditya siram
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