Haskell IO с интерактивом и картой - PullRequest
6 голосов
/ 31 мая 2011

Я пытаюсь создать интерактивную программу на Haskell, используя функцию interact с map.

Вот что я получаю в ghci (насколько я могу судить, этоспособ, которым все учебные пособия объясняют interact использование - кроме результата).

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

Обратите внимание, что на самом деле происходит то, что каждый вводимый мной символ мгновенно повторяется, и после нажатия клавиши Return появляется восклицательный знак.Я, однако, ожидал этого:

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

Это прекрасно работает, если я использую ту же структуру программы, но filter вместо map.

Ответы [ 2 ]

10 голосов
/ 31 мая 2011

Проблема в том, что ghci меняет режим буферизации на символ.Это то, что программа начинает обрабатывать код, как только он там есть.Если вы напишите эту строку в файл с именем foo.hs

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

и запустите ее, используя runhaskell foo.hs, вы увидите, что она работает как положено, поскольку Haskell по умолчанию использует буферизацию строки.

3 голосов
/ 31 мая 2011

Как говорит 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> 
...