Haskell 2010 garantisce che è denotazionalmente equivalente alla stringa unita, ma non ha nulla da dire su come dovrebbe essere compilato. È abbastanza facile controllare con lo strumento ghc-core
, però.
-- Test.hs
main = putStrLn $ "Hello " ++ "world"
e quando si corre 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"
...
e vediamo che la stringa è stata fusa nella lingua intermedia Nucleo.
Modifica: Per sottolineare il mio accordo con le altre risposte, proprio perché questo programma particolare, ha un core dump con la stringa risultante dalla fusione non garantisce che il compilatore lo farà per tutte le stringhe. Essere conformi alle specifiche Haskell non implica molto su come le cose vengono compilate.
fonte
2013-07-07 15:23:37
Un'attenta sull'utilizzo del "core dump" per la stampa del core code intermedio :-) – David
Forse ho trasmesso un senso artificiale di quanto sia facile sbirciare al core e imparare come stanno le cose ... ma! Ho spesso trovato che non sia così difficile. All'inizio scoraggiante. –