2010-05-10 4 views
4

Недавно я начал изучать Haskell. У меня есть этот кодHaskell Console IO в блокноте ++

module Main 
    where 

import IO 

main = do 
      hSetBuffering stdin LineBuffering 
      putStrLn "Please enter your name: " 
      name <- getLine 
      putStrLn ("Hello, " ++ name ++ ", how are you?") 

Я использую компилятор GHC вместе с редактором notepad ++. Проблема взаимодействия выглядит следующим образом:

Процесс начался >>>
Влад
Пожалуйста, введите ваше имя:
Здравствуйте, Влад, как ты?
< < < Процесс завершен.

Как вы можете видеть, вывод записывается только после ввода ввода чего-то. Это было немного неожиданно, поскольку я был уверен, что программа сначала спросит мое имя, затем я войду в него, и тогда он поздоровался. Ну, это именно то, что произойдет, если я запустил exe вручную, но не буду запускать его с помощью блокнота ++ и использовать его консольную оболочку ...

Как я могу сделать блокнот ++ отображать вывод, когда он должен, а не все? незадолго до завершения программы? Возможно ли это?

ответ

7

Попробуйте установить stdout в LineBuffering! Кроме того, загрузка вашей программы в ghci вместо runnign скомпилированной версии, похоже, не требует какой-либо буферизации вообще ...

Кстати, я не знал о консоли в АЭС - спасибо, что указал мне на нее !

+0

Это сработало, спасибо. Это правда, это не так, я не знаю, почему это важно в блокноте ++. Я добавил, что, поскольку этот http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf (на странице 40 что-то) говорит, что он должен исправить именно эту проблему, но я не думал также о LineBuffering stdout. – IVlad

+0

Ну, на самом деле, это не говорит, что это должно исправить именно это. В нем говорится, что он должен исправить ошибки, когда чтение ввода не завершено после ввода одной строки. Поэтому я предполагаю, что в этом случае я должен быть LineBuffering stdout. Еще раз спасибо! – IVlad

2

Я не знаком с блокнотом ++, но быстрый и Hacky метод, вероятно, будет делать

hFlush stdout 

после каждого putStrLn. Вы даже можете сделать следующий метод:

nppPutStrLn s = putStrLn s >> hFlush stdout