2015-05-17 3 views
3

Я хочу закончить функцию 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.

ответ

1

Используется в контексте

import System.IO 
import Control.Concurrent.Async 
import Control.Monad 

main = do 
    h <- openFile "./a" ReadWriteMode 
    mainLoop h "user" 
    hClose h 

это прекрасно работает и без hPutStrLn - что вы делали? (где ./a - большой файл, например «dmesg> a»)

+1

Полный контекст можно найти здесь [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

Смежные вопросы