Haskell IO与交互和地图

not*_*xit 6 io haskell map buffering

我正在尝试使用interact函数生成交互式Haskell程序map.

这是我在ghci中得到的(据我所知,这是所有教程解释interact用法的方式- 结果除外).

*Module> interact $ unlines . map (++ "!") . lines
tteesstt
!
Run Code Online (Sandbox Code Playgroud)

请注意,实际发生的是我输入的每个字符都会立即重复,然后按Return键后会出现感叹号.然而,我期待这样:

*Module> interact $ unlines . map (++ "!") . lines
test
test!
Run Code Online (Sandbox Code Playgroud)

如果我使用相同的程序结构,它可以完美地工作,而filter不是map.

fuz*_*fuz 10

问题是ghci将缓冲模式更改为每个字符.也就是说,程序一旦开始就会开始处理代码.如果将此行写入名为的文件中foo.hs

main = interact $ unlines . map (++ "!") . lines
Run Code Online (Sandbox Code Playgroud)

并使用runhaskell foo.hs你运行它将看到它按预期工作,因为Haskell默认使用行缓冲.