2012-08-12 8 views
8

Çok garip bir sorunum var. GHCi çalışan kıyasla derlenmiş zaman bir kod derleme yaparken aşağıdaki kod, bir beklendiği gibi öyle GHCi içinde çalıştırmakGHCi ve derlenmiş kod farklı davranıyor gibi görünüyor

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

Ancak

Please enter your name: dglmoore 
Hello, dglmoore, how are you? 

, farklı sonuçlar verir daha önce benzer bir sorun gördüğüm

dglmoore 
Please enter your name: Hello, dglmoore, how are you? 

, herhangi bir çıkış üretilir önce bu ile bitirmek yüzden girdi sağlamak gerektirir çalıştırılabilir, ama onu tekrar bulmak için görünmüyor olabilir.

ben Haskell Platform sürümü 2012.2.0.0 gelen ghc sürümünü 7.4.1 kullanıyorum.

Herkes farklı sonuçlar verir niçin bir fikrin var ve ben nasıl alabilirim her iki sürümleri "doğru" olanı yapmak?

cevap

12

Bu bir tamponlama mesele. Genellikle arabelleğe aldırış yapmazsanız, arabelleğe aldırmazsınız (yani, çıktı, aslında yeni bir satır yazdırılıncaya veya tampon boyutunu aşana kadar ekranda görünmez). Ghh içinde değil, bu yüzden sorun görünmüyor.

getLine numaralı telefonu aramadan önce, çıktının stdout'a basılması için hFlush stdout310 çıkışını kullanabilirsiniz.

Alternatif hFlush ihtiyacını ortadan kaldırarak, tamamen tamponlama devre dışı bırakmak için hSetBuffering NoBuffering kullanabilir. Bununla birlikte, IO performansı üzerinde olumsuz bir etkisi olabilir.

+0

Vay be, ben iki yıl daha iyi kısmını için Haskell kullanıyorum ve önce sorunun rastlamak hiç. Büyüleyici bir şekilde çalıştı. –

+3

@DougMoore Programlama dillerinin çoğunda satır çıktısı olduğunu unutmayın - sadece Haskell'i değil (girişi okuyan bazı dillerde girişin otomatik olarak çıkması, bu hata kaynağının kaldırılması). – sepp2k