Haskell - 在putStr之前调用getLine

Dan*_*iel 0 haskell

当我想在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)

为什么这两个语句的功能不同?它是换行符的补充吗?

chi*_*chi 6

putStr "enter value: " 实际上写入输出缓冲区,当缓冲区变满或找到换行符时,该输出缓冲区仅在稍后刷新到实际标准输出.

这与C编程语言中的机制大致相同.

所以,即使putStr "enter value: "之前运行过getLine,我们也看不到输出消息,但感觉不对.

解决方案是明确刷新标准输出句柄.

import System.IO
-- ...
putStr "enter value: "
hFlush stdout
var <- getLine
Run Code Online (Sandbox Code Playgroud)