在haskell中带有提示的奇怪缓冲

Kwa*_*rtz 0 haskell

我在Haskell玩耍时发现了一些奇怪的东西.我在下面定义了一个简单的提示函数.

-- file: test.hs
main :: IO ()
main = putStrLn . ("Hello, " ++) =<< (putStr "Name: " >> getLine)
Run Code Online (Sandbox Code Playgroud)

当我runhaskell这样,它按预期工作,打印提示,等待我的输入,然后打印问候语.

$ runhaskell test.hs
Name: kwarrtz
Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)

然而,当我编译它时,事情变得奇怪.当我运行它时,它不会打印提示,而是给我一个空行并等待输入.当我输入我的名字并按Enter键时,它会在同一行打印提示和问候语.换句话说,getLine发生在之前putStr.

$ ghc test.hs
$ ./test
kwarrtz
Name: Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)

对发生了什么的任何想法?我想它与终端上的线路缓冲有关,但我不确定(我或者我在代码中犯了一些非常荒谬的错误).

我在Mac OS X El Capitan上运行GHC 7.8.3并使用默认的终端应用程序.

luq*_*qui 7

缓冲.

hSetBuffering stdout NoBuffering
Run Code Online (Sandbox Code Playgroud)

我想你可以从中获得所有这些 System.IO