
Dear Cafe, with OverloadedStrings, the compiler inserts `fromString` applications at String literals. I was wondering - are these floated out? {-# language OverloadedStrings #-} import Data.String import Debug.Trace data Foo = Foo deriving Show instance IsString Foo where fromString "Foo" = trace "**fromString**" Foo main = let { f Foo = "Foo" :: Foo; g _ = "Foo" :: Foo } in print $ map (f . g) [0..1] With ghc -O1, I get **fromString** [Foo,Foo] That's good - not just floated out, but also interned (? - both "Foo" are really the same, just one call) With ghc -00, and in ghci, I get **fromString** **fromString** **fromString** **fromString** [Foo,Foo] no floating here. Is there a way to get this floated in ghci? The background of my question is that overloaded strings, and ghci, are heavily used in Tidal Cycles https://hackage.haskell.org/package/tidal I guess it's mostly fine, because it's rare (in live coding performance) that application code contains function definitions. - J.