[Haskell] Simulating client server communication with recursive monads

Jan Stranik janstranik at yahoo.de
Tue Jan 15 20:27:25 EST 2008


Thanks Chris,
I appreciate your quick answer. 
Do you know what is the theoretical foundation for having mfix process side-effects in the lexical order as opposed to execution order?  Could you point me to some papers, if you know of any off top your head? 

Thanks a lot,

Jan

-----Original Message-----
From: Chris Kuklewicz [mailto:haskell at list.mightyreason.com] 
Sent: Tuesday, January 15, 2008 11:07 AM
To: Jan Stranik
Cc: haskell
Subject: Re: [Haskell] Simulating client server communication with recursive monads

Jan Stranik wrote:
> My question was why does the output from writer shows first all output 
> from server, then followed by all output from client.

The effect of "mfix" is that the side-effects of the calculation still occur in 
the lexical order.

Since server is before client, the output of the server precedes the client.

> I would like to 
> see output from client and server to alternate in the order in which the 
> computation occurs, namely [server, client, server, client, server, 
> client, …].

Then you have to restructure the code slightly.  This works:

> import Control.Monad
> 
> import Control.Monad.Writer.Lazy
> 
> client:: [Integer] -> Writer [String] [Integer]
> client as = do
>   dc <- doClient as
>   return (0:dc)
>     where
>       doClient (a:as) = do
>               tell ["Client " ++ show a]
>               as' <- doClient as
>               return ((a+1):as')
>       doClient [] = return []
> 
> server :: [Integer] -> Writer [String] [Integer]
> server [] = return []
> server (a:as) = do
>   tell ["Server " ++ show a]
>   rs <- server as
>   return (2*a:rs)
> 
> simulation :: [(String,String)]
> simulation = 
>   let (clientOut,clientLog) = runWriter (client serverOut)
>       (serverOut,serverLog) = runWriter (server clientOut)
>   in zip serverLog clientLog
> 
> main = print (take 10 simulation)



More information about the Haskell mailing list