2010-03-23 14 views
36

Tôi có đoạn mã sau:hành động IO Wrong đặt hàng bằng putStr và getline

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

Khi tôi chạy nó (với runhaskell) hoặc biên dịch nó (GHC 6.10.4) kết quả là như thế này:

asd 
Test input : asd 

Tại sao Test input : asd được in sau asd?

Trong mẫu mã trên http://learnyouahaskell.com/, sử dụng putStr, đầu ra được trình bày của getLine khác với của tôi. Khi tôi sử dụng putStrLn chương trình hoạt động như mong đợi (in, sau đó nhắc và in).

Đây có phải là lỗi trong ghc hoặc đó là cách hoạt động của nó?

Trả lời

48

Điều này là do ghci vô hiệu hóa bộ đệm, trong khi chương trình được biên dịch với ghc có dòng đệm theo mặc định. Bạn có thể thấy điều này bằng cách chạy này:

import IO 
main = print =<< hGetBuffering stdout 

Trong ghci bạn thấy NoBuffering trong khi với runghc bạn nhận được LineBuffering. Vì ký tự dòng mới không in cho đến khi sau thông tin nhập của người dùng, lời nhắc cũng không.

Khắc phục sự cố bằng cách thêm hFlush stdout sau lời nhắc của bạn (hoặc tắt đệm với hSetBuffering stdout NoBuffering, nhưng điều đó có thể là xấu).

+3

bạn có thể cần 'nhập System.IO' thay vì' nhập IO' –