当我想在Haskell中读取输入之前放一些文本时,我尝试这样写:
putStr "enter value: "
var <- getLine
但是输出需要用户输入才能显示文本:
[input]
enter value:
当我使用putStrLn
代替putStr
时,它会显示为:
enter value:
[input]
为什么这两个语句的功能不同?这是换行符的添加吗?
答案 0 :(得分:6)
putStr "enter value: "
实际写入输出缓冲区,当缓冲区变满或找到换行符时,该输出缓冲区仅在稍后刷新到实际标准输出。
这与C编程语言中的机制大致相同。
因此,即使在putStr "enter value: "
之前运行getLine
,我们也看不到输出消息,但感觉不对。
解决方案是明确刷新标准输出句柄。
import System.IO
-- ...
putStr "enter value: "
hFlush stdout
var <- getLine