In Bezug auf den Steuercode Literale löschen, ist dies, weil Sie es geschafft haben, alle die zu entkommen Zeileneditoren (Readline, Haskeline), die normalerweise Ihre Tastendrücke interpretieren würden.
Ich kenne die Einzelheiten nicht, aber GHCi aufrufen ist so etwas wie das Starten einer Subshell mit bash --noediting
. Dadurch kann GHCi rohe Tastendrücke ohne Störungen durch die readline-Bibliothek empfangen. Dies wird getan, weil Haskeline —, die GHCi anstelle von Readline — verwendet, mit Dingen wie Tab Completion für die verfügbaren Funktionen einfacher konfiguriert werden kann (Sie wussten, GHCi zur Verfügung gestellt Registerkarte Abschluss, oder?).
Der Aufruf von getLine
von GHCi fällt dann effektiv durch eine Falltür und weicht Haskeline vollständig aus, indem er direkt auf die Standardeingabe geht. Es gibt schließlich nur eine Stdin. Sie tippen jetzt direkt in ein ungepuffertes Terminal.
Zurück zu Ihrer ersten Sorge, es gibt nur eine stdin ist auch, warum GHCi sofort nach dem Drucken der Prelude>
prompt kiel. interact
(die hGetContents
hinter den Kulissen verwendet) behauptet, dass es alle Eingaben ansprechen wird, die jemals durch das Handle (stdin) als eine große faule String
kommen werden. Effektiv kann es keine verbleibende Eingabe auf dem Handle geben, die interact
nicht schon beansprucht hat, damit umzugehen, so wird der Handle sofort in einen “ halbgeschlossenen ” Zustand versetzt. Es ist nicht geschlossen (es könnte noch mehr Eingang sein, der als Teil dieser faulen String
gets! Gelesen wird), aber es ist ist für alle Neulinge geschlossen, sonst würde Eingabe (interact
und neue Leser des Handle wie getLine
Duplikate erhalten werden würde die gleiche Linie bekommen!).
Zurück zu GHCi, nachdem interact
verwendet wurde, ist stdout immer noch in Ordnung, also wird die Aufforderung wie üblich gedruckt, dann lehnt GHCi auf Haskeline, um eine Linie für die Verarbeitung zurückzugeben. Haskeline (als Zeileneditor) ruft eine Blockierung getChar
(iirc) auf, um entweder ein Zeichen zur Zeile hinzuzufügen oder einen Zeilenbearbeitungsbefehl auszuführen, und stirbt, weil es ein halbgeschlossenes Handle adressiert. So fällt eine schwächere Kreatur und das große Rad des Lebens rollt weiter.
Wie läuft das Programm? Was erwartest du auch? GHCI scheint alles auszuführen, was reingehört wird, daher bin ich mir nicht sicher, ob du jemals wieder stdin lesen kannst. – pdexter
Dies sieht im Zusammenhang mit Ihrem Problem: http://stackoverflow.com/questions/38776023/handle-is-semi-closed-error-in-haskell – villou24
"interagieren" und GHCi nicht gut, IIRC. 'interactive' will ALL die stdin für sich selbst, und GHCi kann es nicht zurückbekommen. – chi