
The compiler dumps are illuminating, thank you. I'm afraid I don't always compile under -O. In fact I never debug with -O. I see now what I'm missing. (Pain, grief, despair.) Ketil Malde wrote:
On Thu, 2007-08-16 at 12:50 -0700, Kim-Ee Yeoh wrote:
Aaron Denney wrote:
The compiler should be able to assemble it all at compile time, right?
'Course not. The (++) function like all Haskell functions is only a /promise/ to do its job. What does "assembling at compile time" mean here:
s = "I will not write infinite loops " ++ s
% cat C.hs
module Test where
x = "Foo" ++ "Bar" y = "Zot" ++ y
% ghc -ddump-simpl C.hs
==================== Tidy Core ==================== Test.x :: [GHC.Base.Char] [GlobalId] [] Test.x = GHC.Base.++ @ GHC.Base.Char (GHC.Base.unpackCString# "Foo") (GHC.Base.unpackCString# "Bar")
Rec { Test.y :: [GHC.Base.Char] [GlobalId] [] Test.y = GHC.Base.++ @ GHC.Base.Char (GHC.Base.unpackCString# "Zot") Test.y end Rec }
If I interpret it correctly, the compiler does approximately nothing - reasonably enough, since we didn't ask for optimization. With -O:
% ghc -ddump-simpl C.hs -O
==================== Tidy Core ==================== Rec { Test.y :: [GHC.Base.Char] [GlobalId] [Str: DmdType] Test.y = GHC.Base.unpackAppendCString# "Zot" Test.y end Rec }
Test.x :: [GHC.Base.Char] [GlobalId] [Str: DmdType] Test.x = GHC.Base.unpackCString# "FooBar"
y gets turned into an unpackAppendCString#, which I can only presume is a sensible way to represent a cyclic list, while x gets concatenated compile-time.
-- View this message in context: http://www.nabble.com/Hints-for-Euler-Problem-11-tf4114963.html#a12196104 Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.