为什么 Haskell NoBuffering 选项似乎仍然可以缓冲?

Why does Haskell NoBuffering option still seem to buffer?

我在 ghci 中加载了一个文件,内容如下:

h <- openFile "somefile.txt" ReadMode
hSetBuffering h NoBuffering

然后我在文本编辑器中修改并保存了 somefile.txt。当我在 ghci 中多次调用 hGetChar 时,我收到了文件的旧字符(好像整个文件在我打开时都被缓冲了一样)。我希望调用 hGetChar 来 return 修改后的内容。为什么不是这样?

编辑: 上述案例中修改后的内容没有显示出来,确实是文本编辑器的问题。当改为使用 cat 命令时 (cat > somefile.txt),则修改后的文件内容为 returned.

然而,它似乎仍然在做缓冲。假设文件内容如下:

ABCDEFGHI
123456789

如果我 运行 hGetChar 我按预期得到 'A'。

现在,如果我使用 cat (cat > somefile.txt) 将内容更改为以下内容,并再次使用 运行 hGetChar,我希望 'Z' 但它是 returning 'B':

AZZZZZZZZ

BufferMode 仅在写入句柄时相关,而不是从句柄读取时。

来自 [note Buffered Reading]GHC.IO.Handle.Types:

Note that the buffering mode (haBufferMode) makes no difference when
reading data into a Handle.  When reading, we can always just read all
the data there is available without blocking, decode it into the Char
buffer, and then provide it immediately to the caller.

输入 BufferMode 的文档似乎已过时。