--filename main.hs
main :: IO ()
main = do
loop "hello" "bye"
loop :: String -> String -> IO ()
loop inp1 inp2 = do
putStrLn $ "Type " ++ inp1
userInput <- getLine
if userInput == inp1
then do
putStrLn "correct answer"
loop inp2 inp1
else if userInput == "exit"
then do
putStrLn "exiting program"
return ()
else do
loop inp1 inp2
编译后,我可以在终端中运行它,并键入命令,例如Hello Bye和Exit。该程序工作i制作了第二个脚本,与第一个脚本
交互
--filename test_program.hs
import System.IO (hPutStrLn, hFlush, hGetLine, hClose, hSetBuffering, BufferMode( NoBuffering,LineBuffering ))
import System.Process (createProcess,
waitForProcess,
shell,
proc,
StdStream(CreatePipe),
std_in,
std_out,
std_err)
import Control.Monad (when)
main :: IO ()
main = do
(Just hin, Just hout, Just herr, ph) <- createProcess (shell "./main")
{ std_in = CreatePipe
, std_out = CreatePipe
, std_err = CreatePipe
}
hSetBuffering hin LineBuffering
hSetBuffering hout NoBuffering
putStrLn =<< hGetLine hout
hPutStrLn hin "bla"
putStrLn =<< hGetLine hout
hPutStrLn hin "hello"
putStrLn =<< hGetLine hout
hPutStrLn hin "exit"
putStrLn =<< hGetLine hout
_ <- waitForProcess ph
return ()
当我运行此程序时,我期望以下消息顺序 typehello
typehello
--filename test_program.hs
import System.IO (hPutStrLn, hFlush, hGetLine, hClose, hSetBuffering, BufferMode( NoBuffering,LineBuffering ))
import System.Process (createProcess,
waitForProcess,
shell,
proc,
StdStream(CreatePipe),
std_in,
std_out,
std_err)
import Control.Monad (when)
main :: IO ()
main = do
(Just hin, Just hout, Just herr, ph) <- createProcess (shell "./main")
{ std_in = CreatePipe
, std_out = CreatePipe
, std_err = CreatePipe
}
hSetBuffering hin LineBuffering
hSetBuffering hout NoBuffering
hPutStrLn hin "bla"
hPutStrLn hin "hello"
hPutStrLn hin "exit"
putStrLn =<< hGetLine hout
putStrLn =<< hGetLine hout
putStrLn =<< hGetLine hout
putStrLn =<< hGetLine hout
putStrLn =<< hGetLine hout
_ <- waitForProcess ph
return ()
GHC在编译程序时试图帮助您进行缓冲选择。粗略:当连接到终端时,默认情况下将把手柄延迟,以支持舒适的交互式使用,但默认情况下,这些手柄默认禁止了非终端,以支持有效的程序到程序传输。
手工选择您的缓冲以修复。main.hs
您可能会说:“但是在main :: IO ()
main = do
hSetBuffering stdout LineBuffering
loop "hello" "bye"