2010-03-23 16 views
36
kullanarak sipariş

Aşağıdaki kod var:Yanlış IO eylemleri putStr ve getLine

: Ben Sonuç aşağıdaki gibidir ( runhaskell ile) çalıştırmak veya (ghc 6.10.4) derlemek zaman

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

asd 
Test input : asd 

asd neden Test input : asd yazdırılıyor?

kullanan http://learnyouahaskell.com/ kod örneğinde, getLine'un sunduğu çıktılar benimkilerden farklıdır. putStrLn'u kullandığımda, program beklendiği gibi çalışır (yazdır, sonra istemi ve yazdır).

ghc'da bir hata mı, yoksa çalışması gereken yol mu?

cevap

48

Bunun nedeni ghc'nin arabelleklemeyi devre dışı bırakmasıdır, ghc ile derlenen program varsayılan olarak satır ara belleğe sahiptir. Bunu çalıştırarak bu görebilirsiniz: runghc ile siz LineBuffering alırken GHCi olarak

import IO 
main = print =<< hGetBuffering stdout 

sen NoBuffering bkz. Yeni satır karakteri, kullanıcı girdisi'dan sonra 'a kadar yazdırılmayacağından, istem de yoktur.

Sorunuzdan sonra hFlush stdout ekleyerek düzeltin (veya hSetBuffering stdout NoBuffering ile arabelleğe almayı devre dışı bırakın, ancak bu muhtemelen kötü olabilir).

+3

"import IO" yerine "import System.IO" öğesine ihtiyacınız olabilir –