私は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 ()
しかし、これにより、ソケットを介してデータの送信を開始するとすぐにプログラムがクラッシュします。
ここに私の質問があります:なぜですか?その修正は何ですか?