【发布时间】:2015-06-19 05:48:25
【问题描述】:
我写了一个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 ()
但这会使程序在我开始通过套接字发送数据时立即崩溃。
这是我的问题:为什么?解决办法是什么?
【问题讨论】:
-
你为什么用
foldl而不是foldM_? -
你所说的“更单子”是什么意思?
-
我认为
foldl1是导致崩溃的罪魁祸首 - 你不能有效地将折叠放在无限列表上,它会无限循环或引发异常,并且可能会耗尽内存。
标签: sockets haskell network-programming io-monad