我正在尝试使用带有interact
的{{1}}函数生成交互式Haskell程序。
以下是 ghci 的内容(据我所知,这是所有教程解释map
用法的方式 - 除了结果)。
interact
请注意,实际发生的是我输入的每个字符都会立即重复,然后按Return键后会出现感叹号。然而,我期待着这一点:
*Module> interact $ unlines . map (++ "!") . lines
tteesstt
!
如果我使用相同的程序结构,但*Module> interact $ unlines . map (++ "!") . lines
test
test!
代替filter
,则效果很好。
答案 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>