Haskell IO 与交互和地图
我正在尝试使用 interact
函数和 map
来生成一个交互式 Haskell 程序。
这是我在 ghci 中得到的内容(据我所知,这是所有教程解释 interact
用法的方式 - 除了结果)。
*Module> interact $ unlines . map (++ "!") . lines
tteesstt
!
请注意,实际发生的情况是,我输入的每个字符都会立即重复,并且在我按回车键后,会出现感叹号。然而,我期待的是这样的:
*Module> interact $ unlines . map (++ "!") . lines
test
test!
如果我使用相同的程序结构,但使用 filter
而不是 map
,它就会完美地工作。
I am trying to produce an interactive Haskell program using the interact
function with map
.
Here's what I get in ghci (as far as I can tell, that's the way all tutorials explain interact
usage -- except the result).
*Module> interact $ unlines . map (++ "!") . lines
tteesstt
!
Note that what actually happens is that every character I type is instantly repeated and after I press Return the exclamation mark appears. I was, however, expecting this:
*Module> interact $ unlines . map (++ "!") . lines
test
test!
It works perfectly if I use the same program structure, but filter
instead of map
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是 ghci 将缓冲模式更改为每个字符。也就是说,程序一出现就开始处理代码。如果您将此行写入名为
foo.hs
的文件中,并使用
runhaskell foo.hs
运行它,您将看到它按预期工作,因为 Haskell 使用行缓冲默认。The problem is that ghci changes the buffering mode to per-character. This is, that the program starts to process the code as soon as it is there. If you write this line into a file called
foo.hs
and run it using
runhaskell foo.hs
you will see that it works as expected, because Haskell uses line-buffering by default.正如 FUZxxl 所说,这是一个缓冲问题。
要更改 GHCi 中的缓冲样式,请使用
hSetBuffering
As FUZxxl says, it's a buffering issue.
To change buffering styles in GHCi, use
hSetBuffering