2013-07-07 15 views
21

Gewährleistet Haskell 2010 String-Literale zur Kompilierzeit zu verketten?Verkettet Haskell String-Literale zur Kompilierzeit?

Wenn ich

"This is a " ++ 
"very long String that " ++ 
"spans several lines" 

hat der Compiler behandeln es als

"This is a very long String that spans several lines" 

Ich möchte meine Source-Leitungen halten weniger als 80 Zeichen lang sein, wenn möglich, aber ich möchte nicht vorstellen Laufzeit-Ineffizienz.

Antwort

16

Verwenden einer spalt eine Folge von einem oder mehreren Leerzeichen zwischen umgekehrten Schrägstrichen:

"This is a \ 
\very long String that \ 
\spans several lines" 

Die Nullbreite entspricht \&, nützlich für die numerische Fluchten aus digit Zeichen trennt:

"\123\&45" == "{45" 
"\12345" == "〹" 
19

Haskell 2010 garantiert, dass es den fusionierten String denotational entspricht, hat aber nichts darüber zu sagen, wie es kompiliert werden sollte. Es ist jedoch einfach, dies mit dem Tool ghc-core zu überprüfen.

-- Test.hs 
main = putStrLn $ "Hello " ++ "world" 

und wenn wir ghc-core Test.hs

[1 of 1] Compiling Main    (Test.hs, Test.o) 

==================== Tidy Core ==================== 
Result size of Tidy Core = {terms: 19, types: 23, coercions: 9} 

main2 :: [Char] 
[GblId, 
Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=False, 
     ConLike=False, WorkFree=False, Expandable=False, 
     Guidance=IF_ARGS [] 60 0}] 
main2 = unpackCString# "Hello world" 

... 

und sehen laufen, dass die Zeichenfolge in der Core-Zwischensprache verschmolzen wurde.


Edit: Um meine Vereinbarung mit anderen Antworten zu betonen, nur weil dieses besondere Programm einen Core-Dump mit dem fusionierten String hat garantiert nicht, dass der Compiler für alle Strings tun. Die Übereinstimmung mit der Haskell-Spezifikation bedeutet nicht viel darüber, wie die Dinge kompiliert werden.

+0

Sorgfältige über die Verwendung von "Core Dump" zum Drucken von Zwischenkerncode :-) – David

+0

Ich habe vielleicht ein künstliches Gefühl vermittelt, wie einfach es ist, einen Blick auf den Kern zu werfen und zu lernen, wie sich die Dinge verhalten ... aber! Ich habe oft festgestellt, dass es nicht so schwierig ist. Einfach nur entmutigend. –

19

Does Haskell 2010 Garantie Stringliterale bei der Kompilierung verketten?

Nr

Laufzeiteffizienz ist weit weg vom Anwendungsbereich Haskell2010. Wir wollen experimentelle Implementierungen nicht verbieten, nur weil sie langsam sind.

Auch die Angabe, was während der Kompilierzeit getan werden sollte, würde für Dolmetscher wie Hugs Probleme verursachen.

Schließlich ist es nützlich, den Implementierern etwas Freiheit zu geben. Vielleicht wäre es unter irgendwelchen seltsamen Umständen tatsächlich schneller, die Saite nicht vorher zu berechnen.

Haskell 2010 spricht über Kompilierzeit nur im Zusammenhang mit Fehlern. (Z. B. Typfehler sind garantiert Kompilierzeit.)

4

Ich nicht diese Haskell garantiert das. Es könnte Compiler kommen wie ghc Durchführung dieser Optimierung, aber es gibt keinen Standard, dies zu erhalten. Es kann also vorkommen, dass diese Optimierung in einer zukünftigen Version nicht stattfindet.

Warum verwenden Sie Template Haskell nicht, wenn Sie wirklich garantieren wollen, dass es zur Kompilierungszeit ausgeführt wird?Das folgende Beispiel wird auf ghc getestet, aber ich denke, man kann es auch auf anderen Compilern funktioniert:

In einer Moduldatei Sie einen Code wie dieser

module Concat where 
import Language.Haskell.TH 

(<++>) :: String -> String -> ExpQ 
(<++>) x y = stringE (x ++ y) 

Dann in der Datei, die Sie benötigen, haben tatsächlich tun, um die Kompilierung Verkettung

{-# LANGUAGE TemplateHaskell #-} 
import Concat 

f = $("This is a very long string" <++> 
     "which spans over several lines") 

Sie auch in ghc unter Verwendung -ddump-splices überprüfen, dass die verkettete Zeichenfolge bei der Kompilierung erzeugt wird.

+5

Es gibt auch das Dokument [Poor many's here] (http://www.haskell.org/haskellwiki/Poor_man_here_document), das Spleiße anstelle von Inline-Operatoren verwendet. –

+0

@tel Danke. Das sieht viel besser aus. – Satvik

Verwandte Themen