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 に答える