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.
Sorgfältige über die Verwendung von "Core Dump" zum Drucken von Zwischenkerncode :-) – David
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. –