2011-05-31 72 views
5

我正在嘗試使用interact函數與map生成交互式Haskell程序。Haskell IO與交互和地圖

這是我在ghci中得到(據我所知,這是所有的教程解釋interact使用的方式 - 除了結果)。

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

請注意,實際發生的事情是,我輸入的每個字符都會立即重複,並且在按下回車鍵後會出現感嘆號。我是,但是,認爲此:

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

它完美,如果我用同樣的程序結構,但filter而不是map

回答

8

問題是,ghci將緩衝模式更改爲每個字符。這就是程序開始處理代碼,只要它在那裏。如果你寫這行到一個文件名爲foo.hs

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

,並使用runhaskell foo.hs你會看到,它按預期工作,因爲Haskell中默認使用行緩衝運行。

+0

http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/ghci-faq.html – rampion 2011-05-31 16:47:40

+1

謝謝,這是完全正確的。可以通過執行'import IO'然後執行'hSetBuffering stdout LineBuffering'來將其設置爲行緩衝。 – notan3xit 2011-05-31 17:01:10

2

正如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>