Я хочу закончить функцию race_
, но я не знаю, как это сделать.Как закончить функцию race_?
Это код, я прямо сейчас:
mainLoop :: Handle -> String -> IO()
mainLoop handle username = do
_ <- race_ fromServer toServer
putStrLn "Race is done"
return()
where
fromServer = forever $ do
line <- hGetLine handle
putStrLn $ "Server: " ++ line
toServer = do
line <- getLine
case line of
":quit" -> do
--hPutStrLn handle "blabla"
return()
_ -> do
hPutStrLn handle $ line
toServer
Если я раскомментировать строку hPutStrLn handle "blabla"
пользователь увидит Race is done
, когда он набирает :quit
. Без этой строки программа просто зависает, когда пользователь набирает :quit
.
Я считаю неправильным использовать hPutStrLn handle "blabla"
, чтобы закончить race_
. Я предполагаю, что существует лучшая функция для завершения функции race_
. Есть идеи?
Мне кажется странным, что простой return()
не работает, поскольку оба hPutStrLn
и return
возвращают пустое действие IO.
Полный контекст можно найти here. Рукоятка создается handle <- connectTo "localhost" (PortNumber 4000)
. Сервер создан в server.hs. Я запускаю этот код в Windows 7 в «Git bash» (msysgit) с runhaskell
.
Полный контекст можно найти здесь [https://github.com/s4wny/Haskell-TCP-chat/blob/master/client .hs # L42). Ручка создается с помощью 'handle <- connectTo" localhost "(PortNumber 4000)'. Сервер создан в [server.hs] (https://github.com/s4wny/Haskell-TCP-chat/blob/master/server.hs#L48). – Sawny