2010-03-23 1 views
36
를 사용하여 주문할

나는 다음과 같은 코드가 있습니다잘못된 IO 활동은 putStr과의 getline

: 나는 결과는 다음과 같다 ( runhaskell 포함)을 실행하거나 (GHC 6.10.4)를 컴파일 할 때

main = do 
    putStr "Test input : " 
    content <- getLine 
    putStrLn content 

asd 
Test input : asd 

asd 이후에 Test input : asd이 인쇄되는 이유는 무엇입니까?

putStr을 사용하는 http://learnyouahaskell.com/의 코드 샘플에서 getLine의 출력 결과는 내 것과 다릅니다. putStrLn을 사용하면 프로그램이 예상대로 작동합니다 (인쇄, 프롬프트 및 인쇄).

ghc의 버그입니까? 그렇지 않으면 작동하는 방식입니까?

답변

48

이것은 ghci가 버퍼링을 비활성화하고 ghc로 컴파일 된 프로그램이 기본적으로 라인 버퍼링을하기 때문입니다. 이 작업을 실행하여이를 볼 수 있습니다 runghc 당신이 LineBuffering을다면 ghci에서

import IO 
main = print =<< hGetBuffering stdout 

당신이 NoBuffering를 참조하십시오. 사용자 입력이 이후에 개행 문자가 까지 인쇄되지 않으므로 프롬프트도 표시되지 않습니다.

메시지를 입력 한 후 hFlush stdout을 추가하여 문제를 해결하십시오 (또는 hSetBuffering stdout NoBuffering으로 버퍼링을 사용하지 않도록 설정하는 것이 좋을 듯합니다).

+3

'import IO' 대신'import System.IO'가 필요할 수도 있습니다. –