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.
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% 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
.
Tags und Links haskell