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

时间:2015-11-23 07:09:59

标签: haskell

我在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并使用默认的终端应用程序。

1 个答案:

答案 0 :(得分:7)

缓冲

hSetBuffering stdout NoBuffering

我认为你可以从System.IO

获得所有这些