Haskell IO 与交互和地图

发布于 2024-11-10 16:51:56 字数 495 浏览 5 评论 0原文

我正在尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

总攻大人 2024-11-17 16:51:56

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

main = interact $ unlines . map (++ "!") . lines

,并使用 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

main = interact $ unlines . map (++ "!") . lines

and run it using runhaskell foo.hs you will see that it works as expected, because Haskell uses line-buffering by default.

小苏打饼 2024-11-17 16:51:56

正如 FUZxxl 所说,这是一个缓冲问题

要更改 GHCi 中的缓冲样式,请使用 hSetBuffering

Prelude> :m +System.IO
Prelude System.IO> hSetBuffering stdout LineBuffering 
Prelude System.IO> interact $ unlines . map (++"!") . lines
hello
hello!
^CInterrupted.
Prelude System.IO> 

As FUZxxl says, it's a buffering issue.

To change buffering styles in GHCi, use hSetBuffering

Prelude> :m +System.IO
Prelude System.IO> hSetBuffering stdout LineBuffering 
Prelude System.IO> interact $ unlines . map (++"!") . lines
hello
hello!
^CInterrupted.
Prelude System.IO> 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文