Während die allgemeine Meinung der Haskell-Community zu sein scheint, dass es immer besser ist, Text
statt zu verwenden String
, String
verwirrt mich die Tatsache, dass die APIs der meisten gepflegten Bibliotheken immer noch orientiert sind, zum Teufel. Auf der anderen Seite gibt es bemerkenswerte Projekte , die String
insgesamt als Fehler betrachtet werden und Prelude
bei denen alle Instanzen von String
-orientierten Funktionen durch ihre Text
Gegenstücke ersetzt werden.
Gibt es also Gründe für Leute, weiterhin String
schreiborientierte APIs zu schreiben, außer Abwärts- und Standard-Prelude-Kompatibilität und die "Switch-Making-Intertia"? Gibt es möglicherweise andere Nachteile Text
im Vergleich zu String
?
Das interessiert mich besonders, weil ich eine Bibliothek entwerfe und versuche zu entscheiden, welcher Typ zum Ausdrücken von Fehlermeldungen verwendet werden soll.
String
es sich nur um einen Alias für eine Liste vonChar
s handelt, weist es natürlich andere Leistungsmerkmale auf als monolithische DatenText
. Beide Typen sind für den Compiler überhaupt nicht von Belang, da sie nicht primitiv sind und in Bibliotheken definiert sind.Antworten:
Meine uneingeschränkte Vermutung ist, dass die meisten Bibliotheksautoren nicht mehr Abhängigkeiten als nötig hinzufügen möchten. Da Zeichenfolgen buchstäblich Teil jeder Haskell-Distribution sind (sie sind Teil des Sprachstandards!), Ist es viel einfacher, sie zu übernehmen, wenn Sie Zeichenfolgen verwenden und Ihre Benutzer nicht verlangen, Textverteilungen nach Hackage zu sortieren.
Es ist einer dieser "Designfehler", mit denen man nur leben muss, wenn man den größten Teil der Community nicht davon überzeugen kann, über Nacht zu wechseln. Schauen Sie sich an, wie lange es gedauert hat, bis Applicative zu einer Superklasse von Monad wurde - eine relativ kleine, aber begehrte Änderung - und stellen Sie sich vor, wie lange es dauern würde, alle String-Dinge durch Text zu ersetzen.
Um Ihre spezifischere Frage zu beantworten: Ich würde mich für String entscheiden, es sei denn, Sie erhalten durch die Verwendung von Text spürbare Leistungsvorteile. Fehlermeldungen sind normalerweise eher kleine einmalige Dinge, daher sollte es kein großes Problem sein, String zu verwenden.
Auf der anderen Seite, wenn Sie ein ideologischer Purist sind, der Pragmatismus für Idealismus meidet, dann entscheiden Sie sich für Text.
* Ich habe Designfehler in Angstzitate gesetzt, weil Zeichenfolgen als Zeichenliste eine nette Eigenschaft sind, mit der sie leicht über andere vorhandene Listenoperationsfunktionen nachgedacht und in diese integriert werden können.
quelle
Wenn Ihre API auf die Verarbeitung großer Mengen zeichenorientierter Daten und / oder verschiedener Codierungen abzielt, sollte Ihre API Text verwenden .
Wenn Ihr API ist in erster Linie mit kleinen Einmal Saiten für den Umgang, dann den eingebauten in mit String - Typ sollte in Ordnung sein.
Wenn Sie String für große Textmengen verwenden, verbrauchen Anwendungen, die Ihre API verwenden, erheblich mehr Speicher. Die Verwendung mit fremden Codierungen kann die Verwendung je nach Funktionsweise Ihrer API erheblich erschweren.
String ist ziemlich teuer (mindestens 5N Wörter, wobei N die Anzahl der Zeichen im String ist). Ein Wort entspricht der Anzahl der Bits wie die Prozessorarchitektur (z. B. 32 Bit oder 64 Bit): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html
quelle
String
mitByteString
dem ASCII verwechselt.Char
in der Zeichenfolge nur Teil eines Unicode-Zeichens und nicht eines einzelnen Unicode-Zeichens sein kann? Wird das nicht Verwirrung stiften? Löst Data.Text das?Char
sind nicht wie Java oder C #char
. Sie sind vollständige Unicode-Codepunkte (32 Bit).Es gibt mindestens drei Gründe, [Char] in kleinen Projekten zu verwenden.
[Char]
stützt sich nicht auf arkane Mitarbeiter wie Fremdzeiger, Rohspeicher, Roh-Arrays usw., die auf verschiedenen Plattformen unterschiedlich funktionieren oder sogar gar nicht verfügbar sind[Char]
ist die Verkehrssprache in Haskell. Es gibt mindestens drei ‚effizient‘ Wege Unicode - Daten in Haskell zu behandeln:utf8-bytestring
,Data.Text.Text
undData.Vector.Unboxed.Vector Char
jede erfordert den Umgang mit Zusatzpaket.Durch die Verwendung von
[Char]
one erhalten Sie Zugriff auf alle[]
Funktionen der Monade, einschließlich vieler spezifischer Funktionen (alternative Zeichenfolgenpakete versuchen, dabei zu helfen, aber immer noch).Persönlich halte ich utf16 -basierte
Data.Text
einer der fragwürdigen desicions der Haskell - Gemeinschaft, da utf16 Mähdreschern Mängel sowohl utf8 und UTF32 kodieren , während keines ihrer Vorteile haben.quelle
Ich frage mich, ob Data.Text immer effizienter ist als Data.String ???
"Nachteile" ist beispielsweise O (1) für Zeichenfolgen und O (n) für Text. Anhängen ist O (n) für Zeichenfolgen und O (n + m) für strenge Texte. Gleichfalls,
let foo = "foo" ++ bigchunk bar = "bar" ++ bigchunk
ist für Strings platzsparender als für strenge Texte.
Ein weiteres Problem, das nicht mit der Effizienz zusammenhängt, ist der Mustervergleich (übersichtlicher Code) und die Faulheit (vorhersehbar pro Zeichen in Strings, irgendwie abhängig von der Implementierung in Lazy Text).
Texte eignen sich offensichtlich gut für statische Zeichenfolgen und für direkte Änderungen. Für andere Formen der strukturellen Bearbeitung kann Data.String Vorteile haben.
quelle
Ich glaube nicht, dass es einen einzigen technischen Grund gibt, warum String bleiben soll. Und ich kann mehrere sehen, damit es geht.
Insgesamt würde ich zunächst argumentieren, dass es im Fall Text / String nur eine beste Lösung gibt:
Streicherleistungen sind schlecht, da sind sich alle einig
Text ist nicht schwer zu verwenden. Alle Funktionen, die üblicherweise für Zeichenfolgen verwendet werden, sind für Text verfügbar, sowie einige nützliche Funktionen im Zusammenhang mit Zeichenfolgen (Ersetzen, Auffüllen, Codieren).
Zwei Lösungen zu haben, schafft unnötige Komplexität, wenn nicht alle Basisfunktionen polymorph gemacht werden. Beweis: Es gibt SO Fragen zum Thema automatische Konvertierungen . Das ist also ein Problem.
Eine Lösung ist also weniger komplex als zwei, und die Mängel von String lassen sie schließlich verschwinden. Je früher desto besser !
quelle
String
und überhaupt nicht gut funktioniertText
.