2010-09-06 18 views
5

Wie können die nativen Zeilenumbruchzeichen wie '\ n' oder '\ r \ n' in Haskell am besten ermittelt werden?Native Newline-Zeichen?

Ich sehe, es gibt eine "nativeNewline" -Funktion in GHC.IO:Handle, aber davon ausgehen, dass es sich um eine private API und vor allem nicht-Standard-Haskell ist.

Antwort

9

Sie sollten sich die Newline-Darstellung als Teil der Codierung einer Textdatei vorstellen, die wie UTF-8 im Dateisystem gespeichert ist. Eine Textdatei wird normalerweise entschlüsselt, wenn Sie sie in Ihr Programm einlesen und beim Schreiben kodieren - die Umwandlung in und aus der nativen Neuzeilen-Darstellung erfolgt als Teil dieser Kodierung und Dekodierung. In Ihrem Haskell-Programm ist das Zeilenvorschubzeichen immer \n, genauso wie Zeichen durch ihre Unicode-Codepunkte dargestellt werden.

Um das I/O-System über die zu verwendende Newline-Codierung zu informieren, lesen Sie den Abschnitt Newline Conversion in der Dokumentation zu System.IO.

+0

Also wenn ich eine Datei im Speicher (wie Data.Text) generieren würde, sollte ich auf jeden Fall '\ n' verwenden, auch unter Windows? – LennyStackOverflow

+4

Ja. Die Übersetzung in '\ r \ n' erfolgt, wenn Sie den Text in die Datei schreiben. –

+0

Ok, danke Simon. – LennyStackOverflow

2

System.IO.nativeNewline ist nicht privat - Sie können es zugreifen können, um herauszufinden, was GHC die native „Newline“ hält auf der aktuellen Plattform zu sein.

Beachten Sie, dass der Typ dieser Variablen, System.IO.Newline, keine Show Instanz wie von GHC 6.12.3 hat. So können Sie nicht einfach seinen Wert drucken. Überprüfen Sie stattdessen, ob es gleich zu System.IO.LF oder System.IO.CRLF ist.

Doch wie Simon wies darauf hin, sollten Sie nicht brauchen, um über die native Neuzeilensequenz zu wissen, mit normalen Verwendung der textorientierten IO-Funktionen in GHC.

Diese Variable ist zusammen mit dem Rest der neuen Unicode-fähigen -Funktionen des IO-Systems noch nicht Teil des Haskell-Standards. Es war nicht in der Haskell 2010 report enthalten. Da es jedoch in GHC bereits implementiert ist, und es gibt einen ziemlich weit verbreiteten Konsens, dass es wichtig und nützlich ist, erwarten Sie, dass es in einer der kommenden jährlichen Überarbeitungen des Standards enthalten ist.

+0

Danke für die Antwort. Mein Code ist rein und somit nicht über IO. Wie würden Sie das in Data.Text lösen? – LennyStackOverflow

+1

Die 'nativeNewline'-Konstante befindet sich nicht in der IO-Monade, Sie können sie also in reinem Code verwenden. Es befindet sich zufällig in einem Modul mit dem Namen "System.IO", da es normalerweise im Kontext des Lesens und Schreibens von Text in eine Datei oder ein für den Benutzer sichtbares Gerät verwendet wird. In der Tat bin ich nicht sicher, warum Sie über die native Newline-Sequenz wissen müssen, wenn Sie keine Textinformationen mit der Außenwelt austauschen. – Yitz

+0

Um es konkret zu machen: Ich erzeuge LateX-Dateien im Speicher mit Data.Text. Ich bin nicht sicher, wie man die Linien trennt. Soll ich hartcodierte '\ n' verwenden? Ich weiß nicht, was mit den In-Memory-Dateien passieren wird, ob es in eine Datei geschrieben, auf dem Bildschirm angezeigt wird oder nur die gezählten Zeilen. Von Simons Antwort habe ich den Eindruck, dass ich hart codierte '\ n' verwenden kann und Haskell's IO wird es automatisch in '\ r \ n' unter Windows konvertieren. – LennyStackOverflow

Verwandte Themen