2014-01-14 9 views
14

Ich bin gerade über etwas gestolpert, das ich nicht verstehe.Unterschied in der getLine-Funktionalität mit GHCi vs. runhaskell

Wenn ich mit GHCi bin und verwenden getLine ich folgendes erhalten

Prelude> a <- getLine 
Test<Backspace>oo<CR> -- the Backspace action results in a '^?' 
Prelude> a 
"Test\DELoo" 

Wenn ich die gleichen in einer Haskell-Datei

module Main where 

main :: IO() 
main = do a <- getLine 
      putStrLn a 

schreiben und führen Sie das Skript mit runhaskell und geben Sie die gleiche Eingabe, die Rücktaste löscht das 't' wie erwartet.

Warum gibt es einen Unterschied?

Antwort

20

Dies ist auf das unterschiedliche Pufferverhalten in GHCi und GHC zurückzuführen. GHCi hat stdin (Standard-Eingabestream) standardmäßig NoBuffering und GHC-kompilierte Binärdateien/runhaskell verwenden LineBuffering standardmäßig. Wenn Sie das in Ihrem Haskell-Programm explizit tun:

können Sie das GHCi-Verhalten reproduzieren. Wenn Sie

tun
hSetBuffering stdin LineBuffering 

in GHCi, werden Sie viele unerwünschte Nebenwirkungen haben, kann aber die runhaskell Verhalten reproduzieren.

+1

Sie sagen, dass ich 'viele unerwünschte Nebenwirkungen 'haben würde, sind sie nur in ghci unerwünscht oder gibt es eine Art Schutz dagegen in einer kompilierten Version - können Sie das ein bisschen genauer erklären? – epsilonhalbe

+0

Ob Sie es tun oder nicht - ich werde diese Antwort akzeptieren, sobald ich kann! – epsilonhalbe

+2

Sie sind in GHCi unerwünscht. Es wird mit der Art und Weise, wie GHCi selbst Eingaben liest, unordentlich werden. Wenn Sie also Sachen eingeben, die GHCi ausführen soll, sehen Sie sie erst, wenn Sie die Return-Taste drücken. – kosmikus

Verwandte Themen