Automatische Konvertierung zwischen String und Daten.Text in haskell
Als Nikita Volkov erwähnt in seiner Frage Daten.Text vs String auch fragte ich mich warum habe ich zum Umgang mit den verschiedenen String-Implementierungen type String = [Char]
und Data.Text
in haskell. In meinem code benutze ich die pack
und unpack
Funktionen wirklich oft.
Meine Frage: gibt es eine Möglichkeit, eine automatische Konvertierung zwischen den beiden string-Typen, so dass ich vermeiden, schreiben pack
und unpack
so oft?
In anderen Programmiersprachen wie Python oder JavaScript gibt es zum Beispiel eine automatische Konvertierung zwischen ganze zahlen und Gleitkommazahlen, wenn es erforderlich ist. Kann ich etwas erreichen, wie dies auch in haskell? Ich weiß, dass die erwähnten Sprachen sind schwach typisiert, aber ich habe gehört, dass C++ eine ähnliche Funktion.
Hinweis: ich weiß schon, die Sprache Erweiterung { -# LANGUAGE OverloadedStrings #- }
. Aber so wie ich Sie verstehe diese Sprache Erweiterungen gilt nur für strings definiert als "..."
. Ich möchte eine automatische Umstellung für strings, die ich aus anderen Funktionen oder ich haben als Argumente in der Funktion Definitionen.
Erweiterte Frage: Haskell. Text-oder Bytestring deckt auch den Unterschied zwischen Data.Text
und Data.ByteString
. Gibt es eine Möglichkeit, eine automatische Umwandlung zwischen den drei Saiten String
, Data.Text
und Data.ByteString
?
- Es gibt keine solche Sache und nicht sein können, wenn Sie möchten, dass Typ-Inferenz.
- AFAIK die Antwort ist Nein, Haskell nicht automatisch konvertieren zwischen verschiedenen Arten. Sie können die automatische Umwandlung nur für Literale, da string-Literale haben den Typ
AsString a => a
wie Zahl-Literale haben den TypNum a => a
, aber Sie nicht bekommen, die automatische Konvertierungen auf Laufzeit-Werte. - vielen Dank für Eure schnellen Antworten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht.
Haskell nicht impliziten Zwang für die technischen, philosophischen und fast religiösen Gründen.
Als Kommentar, die Umwandlung zwischen diesen Darstellungen nicht kostenlos und die meisten Menschen don ' T wie die Idee, die Sie ausgeblendet haben, und potenziell kostspielige Berechnungen lauert. Außerdem mit Saiten, die als lazy-Listen, Zwang Sie zu einem
Text
- Wert nicht kündigen.Können wir konvertieren die Literale
Text
s automatisch mitOverloadedString
s von desugaring ein string-literal"foo"
zufromString "foo"
undfromString
fürText
nur Anrufepack
.Könnte die Frage sein, zu Fragen, warum Sie nötigt so viel? Gibt es einige, warum tun Sie müssen
unpack
Text
Werte so oft? Wenn Sie ständig ändern Sie die Saiten, es Niederlagen der Zweck ein bisschen.pack
undùnpack
(ich brauche die Daten.Text, denn es ist mehr Speicher effizient, aber ich verwende viele Pakete mit Saiten)unpack
zum übergeben von Daten an andere Pakete, Sie sind mehr oder weniger verlieren die meisten der VorteileText
.Fast Ja:
Data.String.Conversions
Haskell-Bibliotheken den Einsatz von verschiedenen Arten, so gibt es viele Situationen, in denen es keine Wahl aber zu schwer mit der Umsetzung, geschmacklos, wie es ist - umschreiben von Bibliotheken zählt nicht als eine echte Wahl.
Sehe ich zwei konkrete Probleme, die Sie möglicherweise ein erhebliches problem für Haskell Annahme :
Codierung Ende erfordert spezifische Implementierung Kenntnisse in den Bibliotheken, die Sie verwenden möchten.Dies ist ein großes Problem für eine high-level - Sprache
Leistung auf einfache Aufgaben ist schlecht - das ist eine die große Frage für eine generalist Sprache.
Abstraktion von den spezifischen Arten
In meiner Erfahrung, das erste problem ist die Zeit, zu raten, den Namen des Pakets hält die richtige Funktion für Sanitär-zwischen den Bibliotheken, die im Grunde auf denselben Daten arbeiten.
Zu , dass problem gibt es eine sehr praktische Lösung : die
Data.String.Conversions
Paket, vorausgesetzt, Sie sind komfortabel mit UTF-8 als Standard-encoding.Dieses Paket bietet eine einzige
cs
Umwandlung zwischen einer Reihe von verschiedenen Arten.String
Data.ByteString.ByteString
Data.ByteString.Lazy.ByteString
Data.Text.Text
Data.Text.Lazy.Text
So dass Sie nur
import Data.String.Conversions
, und verwenden Siecs
dem ableiten, dass die richtige version des Konvertierungs-Funktion nach Eingabe-und Ausgabe-Typen.Beispiel:
NB : In GHCi Sie in der Regel nicht über einen Kontext, der gibt das Ziel geben, so dass Sie direkt die Konvertierung, indem Sie explizit den Typ des Ergebnisses, wie zum
read
Leistung und der Ruf nach einer "echten" Lösung
Ich kenne keine echte Lösung, wie der noch -, aber wir können schon erahnen, die Richtung
So die Richtung muss sein, diese Arten nicht Verschieden, D. H. in Einklang zu bringen, unter (oder über) ein archtype, aus der Sie alle stammen, so dass die Zusammensetzung von Funktionen mit unterschiedlichen Ableitungen, ohne konvertieren zu müssen.
Nota : ich kann absolut nicht bewerten, die Machbarkeit und möglichen Nachteile dieser Idee. Es kann einige sehr gute Stopper.