Tut Haskell verketten von String-literalen zur compile-Zeit?
Tut Haskell 2010 garantieren zu verketten von String-literalen zur compile-Zeit?
Wenn ich
"This is a " ++
"very long String that " ++
"spans several lines"
weiß der compiler, behandeln Sie es wie
"This is a very long String that spans several lines"
Ich will meinen Quellcode-Zeilen, weniger als 80 Zeichen lang, wenn möglich, ich will aber nicht vorstellen run-time-Ineffizienz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie eine Lücke—eine Folge von ein oder mehr whitespace-Zeichen zwischen backslashes:
Den zero-width-äquivalent ist
\&
, nützlich für die Trennung von numerischen entweicht aus Ziffer, Zeichen:Nicht.
Laufzeit-Effizienz ist weit entfernt von dem Umfang der Haskell2010. Wir wollen nicht zu verbieten, experimentelle Implementierungen, nur weil Sie langsam sind.
Auch, zu sagen, was getan werden sollte, während der compile-Zeit verursachen würde Schwierigkeiten für die Dolmetscher, wie Umarmungen.
Schließlich ist es zweckmäßig, eine gewisse Freiheit zu implementors. Vielleicht unter etwas seltsamen Umständen wäre es tatsächlich schneller, nicht vorausberechnen der string?
Haskell 2010 Gespräche über compile-Zeit nur in den Kontext von Fehlern. (E. g. Typ-Fehler sind garantiert zu compile-Zeit.)
Haskell 2010 garantiert, dass es denotationally entspricht der zusammengefügte string, aber hat nichts darüber zu sagen, wie es kompiliert werden soll. Es ist leicht genug, um zu überprüfen, mit der
ghc-core
Werkzeug, obwohl.und wenn wir laufen
ghc-core Test.hs
sehen, dass sich die Zeichenfolge zusammengeführt wurde im Kern intermediate language.
Edit: Zu betonen, meine Vereinbarung mit anderen Antworten, nur weil dieses Programm hat einen core-dump mit dem zusammengefügten string garantiert nicht, dass der compiler es für alle Saiten. Als konform mit der von Haskell-spec bedeutet nicht viel darüber, wie die Dinge zusammengestellt.
Ich nicht das haskell garantiert. Es könnte kommen Compilern wie
ghc
Durchführung dieser Optimierung aber es gibt keinen standard, der die Erhaltung dieses. So kann es passieren, dass in einer zukünftigen version dieser Optimierung könnten nicht auftreten.Warum kommst du nicht mit Template Haskell, wenn Sie wirklich wollen, um zu garantieren, dass das geschieht bei der Kompilierung. Folgenden Beispiel wird getestet auf ghc aber ich denke man kann es auf anderen Compilern zu:
In eine Modul-Datei können Sie einen code wie diesen
Dann in die Datei, die Sie benötigen, um tatsächlich die compile-Zeit Verkettung
Können Sie selbst überprüfen, in ghc mithilfe
-ddump-splices
dass die verkettete Zeichenfolge wird generiert bei der Kompilierung.