Die Tatsache, dass Haskells Standard String
Implementierung sowohl hinsichtlich der Geschwindigkeit als auch des Arbeitsspeichers nicht effizient ist, ist bekannt. Soweit ich weiß, sind die [] lists
im Allgemeinen in Haskell als einfach verknüpfte Listen implementiert und für die meisten kleinen/einfachen Datentypen (z. B. Int
) scheint es keine sehr gute Idee zu sein, aber für String
scheint es wie totaler Overkill. Einige der Meinungen zu diesem Thema sind:Warum ist Haskells Standard-String-Implementierung eine verkettete Liste von Zeichen?
Auf einfache Benchmarks wie dies auch in interpretierten Sprachen geschriebene Programme wie Python kann Haskell Code entwickeln, den String von einer Größenordnung verwendet.
Efficient String Implementation in Haskell
Da ein String ist nur [Char], dass eine Liste von Char verknüpft ist, bedeutet dies Strings schlechte Referenzlokalität haben, und bedeutet wiederum, dass Strings im Speicher ziemlich groß ist, zumindest ist es N * (21 Bits + Mbits), wobei N die Länge der Zeichenkette und M die Größe eines Zeigers (...) ist. Es ist viel weniger wahrscheinlich, dass Strings durch den Compiler für Schleifen usw. optimiert werden können.
Ich weiß, dass Haskell ByteString
s hat (und Array
s) in mehr schönen Aromen und dass sie schön die Arbeit machen können, aber ich würde die Standardimplementierung erwartet, dass der effizienteste sein.
TL: DR: Warum ist Haskells Standard String
Implementierung eine einfach verknüpfte Liste, obwohl es schrecklich ineffizient und selten für reale Anwendungen (mit Ausnahme der wirklich einfachen) verwendet wird? Gibt es historische Gründe? Ist es einfacher zu implementieren?
Ich gehe davon aus, dass '[Char]' furchtbar bequem ist. –
Ich finde es ist erwähnenswert, dass 'ByteString' definitiv kein Texttyp ist, und' Array' nicht viel besser ist - 'Text' ist wirklich die richtige Lösung. –
Haskell/= GHC. Eine String-Darstellung "Schildkröten ganz nach unten" war ein lobenswertes Design für die frühen Tage von Haskell, als es mehrere verschiedene Compiler/Interpreter gab. –