0

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

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

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

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

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

但这会使程序在我开始通过套接字发送数据时崩溃。

这是我的问题:为什么?解决办法是什么?

4

2 回答 2

11

永远一遍又一遍地重复相同动作的惯用方式是forever

serverLoop :: Socket -> IO ()
serverLoop sock = forever $ do
    (conn, _) <- accept sock
    forkIO $ handleConn conn
于 2015-06-19T06:04:17.550 回答
2

我不知道你所说的“更多单子”是什么意思,但你的函数可以这样写:

serverLoop :: Socket -> IO ()
serverLoop sock = forever (accept sock >>= forkIO . handleConn . fst)
于 2015-06-19T15:03:19.463 回答