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