我在Haskell玩耍时发现了一些奇怪的东西。我在下面定义了一个简单的提示函数。
-- file: test.hs
main :: IO ()
main = putStrLn . ("Hello, " ++) =<< (putStr "Name: " >> getLine)
当我runhaskell
时,它按预期工作,打印提示,等待我的输入,然后打印问候语。
$ runhaskell test.hs
Name: kwarrtz
Hello, kwarrtz
然而,当我编译它时,事情变得奇怪。当我运行它时,它不会打印提示,而是给我一个空行并等待输入。当我输入我的名字并按Enter键时,它会在同一行打印提示和问候语。换句话说,getLine
发生在putStr
之前。
$ ghc test.hs
$ ./test
kwarrtz
Name: Hello, kwarrtz
有关正在发生的事情的任何想法?我想它与终端上的线路缓冲有关,但我不确定(我或者我在代码中犯了一些非常荒谬的错误)。
我在Mac OS X El Capitan上运行GHC 7.8.3并使用默认的终端应用程序。
答案 0 :(得分:7)
缓冲
hSetBuffering stdout NoBuffering
我认为你可以从System.IO