Wie setze ich Stdin in Haskell zurück?

8

Ich versuche, einen URL-View-Klon in Haskell zu schreiben. Das Programm liest eine Nachricht (über STDIN piped), extrahiert alle URLs und fordert den Benutzer auf, eine davon auszuwählen.

Nach dem Lesen der Nachricht erreicht STDIN offensichtlich EOF. In Python setze ich STDIN wie folgt zurück

%Vor%

Wie würde ich das gleiche in Haskell erreichen?

    
janeden 09.02.2012, 13:28
quelle

2 Antworten

7

Soweit ich weiß, gibt es keine Möglichkeit, das eingebaute stdin in Haskell "neu zuzuweisen", aber Sie können sonst ein neues Handle für /dev/tty öffnen. Eine direkte Übersetzung Ihres Python-Codes wäre etwas wie

%Vor%     
shang 09.02.2012, 14:01
quelle
8

Sie können die Zugriffsnummer stdin in Haskell nicht ändern. In Python zeigt die Variable sys.stdin nur auf ein Handle. Wenn Sie es also durch ein neues Datei-Handle ersetzen, bleibt das alte stdin Handle erhalten sys.stdin Variable enthält jetzt die Dateikennung.

Seit dem System.IO.stdin handle ist in Haskell unveränderlich (wie so viele andere Variablen, oder sollte ich Werte sagen), können Sie in Haskell nicht dasselbe tun.

Sie können die Datei /dev/tty mit einem neuen Handle öffnen und diesen Handle verwenden, um vom Terminal zu lesen. Sie können die gleichen Operationen für jedes Handle verwenden wie für stdin . Importieren Sie einfach System.IO , und jedes Mal, wenn Sie es sonst tun würden Verwenden Sie foo ... , um eine Eingabe zu erhalten, stattdessen hFoo handle ... . Um beispielsweise eine Zeile vom Terminal zu lesen, verwenden Sie diesen Code:

%Vor%

Vergessen Sie nicht, Ihr neues Handle mit einem Aufruf von hClose ! zu schließen!

    
dflemstr 09.02.2012 14:04
quelle

Tags und Links