2017-12-01 6 views
0

Wenn ich will einen Text setzen, bevor eine Eingabe in Haskell zu lesen, habe ich versucht es so zu schreiben:Haskell - getLine aufgerufen, bevor putstr

putStr "enter value: " 
var <- getLine 

jedoch der Ausgang erfordert die Eingabe Benutzer, bevor er den Text anzeigt:

[input] 
enter value: 

Wenn ich putStrLn statt putStr, zeigt es, wie es sollte:

enter value: 
[input] 

Warum funktionieren diese beiden Anweisungen anders? Ist es die Ergänzung der Newline?

Antwort

6

putStr "enter value: " schreibt tatsächlich in einen Ausgabepuffer, der erst später auf die tatsächliche Standardausgabe geleert wird, wenn der Puffer voll wird oder wenn ein Zeilenumbruch gefunden wird.

Dies ist ungefähr der gleiche Mechanismus, der in der Programmiersprache C gefunden wurde.

Also, auch wenn putStr "enter value: " vor getLine ausgeführt wird, sehen wir die Ausgabe Nachricht noch nicht, die sich falsch anfühlt.

Die Lösung besteht darin, das Standard-Ausgabehandle explizit zu leeren.

import System.IO 
-- ... 
putStr "enter value: " 
hFlush stdout 
var <- getLine 
Verwandte Themen