将一个IO递归循环重构为Haskell中的monad折叠

时间:2015-06-19 05:48:26

标签: sockets haskell network-programming io-monad

我编写了一个tcp服务器,这是我的主循环方法:

serverLoop :: Socket -> IO ()
serverLoop sock = do
    (conn, _) <- accept sock
    forkIO $ handleConn conn
    serverLoop sock

(注意:handleConn :: Socket -> IO ()是我的程序特有的功能。)

我想将其重构为更多 monadic 方式,这是我的尝试:

serverLoop :: Socket -> IO ()
serverLoop sock = foldl1 (>>) $ map go $ repeat sock
     where go sock = (accept sock) >>= (forkIO . handleConn . fst) >> return ()

但是,一旦我开始通过套接字发送数据,这会使程序崩溃。

以下是我的问题:为什么?是什么解决了这个问题?

2 个答案:

答案 0 :(得分:11)

永远一遍又一遍地重复同一行动的惯用方法是forever

serverLoop :: Socket -> IO ()
serverLoop sock = forever $ do
    (conn, _) <- accept sock
    forkIO $ handleConn conn

答案 1 :(得分:2)

我不知道你的意思是什么&#34;更多monadic&#34;,但你的功能可以这样写:

SELECT