如何完成race_功能?

时间:2015-05-17 19:19:16

标签: haskell

我想完成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 ()不起作用,因为hPutStrLnreturn都返回空IO操作。

可以找到完整的上下文here。句柄由handle <- connectTo "localhost" (PortNumber 4000)创建。服务器在server.hs中创建。我在Windows 7的“Git bash”(msysgit)中使用runhaskell运行此代码。

1 个答案:

答案 0 :(得分:1)

在上下文中使用

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

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

没有hPutStrLn也能正常工作 - 你做了什么? (其中./a是一个大文件,例如&#34; dmesg&gt; a&#34;)