Haskell IO与交互和地图

时间:2011-05-31 16:16:04

标签: haskell map io buffering

我正在尝试使用带有interact的{​​{1}}函数生成交互式Haskell程序。

以下是 ghci 的内容(据我所知,这是所有教程解释map用法的方式 - 除了结果)。

interact

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

*Module> interact $ unlines . map (++ "!") . lines
tteesstt
!

如果我使用相同的程序结构,但*Module> interact $ unlines . map (++ "!") . lines test test! 代替filter,则效果很好。

2 个答案:

答案 0 :(得分:10)

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

的文件中
main = interact $ unlines . map (++ "!") . lines

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

答案 1 :(得分:3)

正如FUZxxl所说,it's a buffering issue

要更改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>