Data.ByteString.Lazy.Internal.ByteString zu string?

8

Versuche, ein Modul zu schreiben, das die externe IP-Adresse meines Computers zurückgibt. Wenn Sie Network.Wreq get function verwenden und dann eine Linse verwenden, um responseBody zu erhalten, ist der Typ, mit dem ich gelandet bin, Data.ByteString.Lazy.Internal.ByteString . Da ich das nachgestellte "\ n" des Ergebnisses herausfiltern möchte, möchte ich das später für einen regulären Ausdruck verwenden. Problem: Dieser scheinbar sehr spezifische ByteString-Typ wird von der Regex-Bibliothek nicht akzeptiert und ich fand keine Möglichkeit, ihn in ein String zu konvertieren.

Hier ist mein bisheriger Versuch (nicht kompilieren).

%Vor%

Also meine Frage ist offensichtlich: Wie konvertiert man diesen lustigen speziellen ByteString in ein String ? Zu erklären, wie ich mich selbst einem solchen Problem annähern kann, wird ebenfalls geschätzt. Ich habe versucht, unpack und toString zu verwenden, habe aber keine Ahnung, was ich importieren soll, um diese Funktionen zu erhalten, wenn sie existieren.

Da ich ein sehr sporadischer Haskell-Benutzer bin, frage ich mich auch, ob mir jemand den idiomatischen Haskell-Weg zeigen könnte, eine solche Funktion zu definieren. Die Version, die ich hier zeige, berücksichtigt schließlich keine möglichen Laufzeitfehler / Ausnahmen.

    
BitTickler 01.06.2016, 14:44
quelle

2 Antworten

1

Ich verstehe einfach nicht, warum Sie darauf bestehen, String s zu verwenden, wenn Sie bereits eine ByteString zur Hand haben, das ist die schnellere / effizientere Implementierung. Das Importieren von regex bringt Ihnen fast keinen Vorteil - zum Parsen einer IP-Adresse würde ich attoparsec verwenden, was großartig mit ByteString s funktioniert.

Hier ist eine Version, die Regex nicht verwendet, aber eine Zeichenfolge zurückgibt - ich habe sie nicht kompiliert, da ich keine Hashell-Einrichtung habe, wo ich gerade bin.

%Vor%     
epsilonhalbe 01.06.2016, 15:46
quelle
8

Kurze Antwort: Verwenden Sie unpack von Data.ByteString.Lazy.Char8

Längere Antwort:

Wenn Sie einen ByteString (einer beliebigen Sorte) in einen String oder Text konvertieren möchten, müssen Sie im Allgemeinen eine Codierung angeben - z. UTF-8 oder Latin1, usw.

Beim Abrufen einer HTML-Seite kann die Codierung, die Sie verwenden möchten, in der Kopfzeile des Inhaltstyps oder im Antworttext selbst als <meta ...> -Tag erscheinen.

Alternativ können Sie auch raten, wie die Codierung des Körpers ist.

In Ihrem Fall nehme ich an, dass Sie auf eine Site wie Ссылка zugreifen und Sie nur Ihre IP-Adresse analysieren müssen. Ohne die Header zu überprüfen oder den HTML-Code zu durchsuchen, wäre eine sichere Codierung also Latin1.

Um ByteStrings über eine Codierung in Text zu konvertieren, sehen Sie sich die Funktionen in Data.Text.Encoding

Zum Beispiel die Funktion decodeLatin1 .

    
ErikR 01.06.2016 15:43
quelle

Tags und Links