
It looks like there's some sort of syntax conflict between CPP and long string literals folded across multiple lines. Is there a way to have both CPP and folded long string literals? $ cat /tmp/foo.hs {-# LANGUAGE CPP #-} module Main(main) where hello :: String hello = "Hello\ \ World!" main :: IO () main = print hello ---- $ ghci /tmp/foo.hs GHCi, version 9.8.1: https://www.haskell.org/ghc/ :? for help [1 of 2] Compiling Main ( /tmp/foo.hs, interpreted ) /tmp/foo.hs:5:25: error: [GHC-21231] lexical error in string/character literal at character 'W' | 5 | hello = "Hello\ | ^ Failed, no modules loaded. λ> Leaving GHCi. When I run the input through "cpp -E" I get: {-# LANGUAGE CPP #-} module Main(main) where hello :: String hello = "Hello \ World!" main :: IO () main = print hello Clearly not what I want, so the subsequent lexical error from GHC is not surprising, but is there a workaround that allows folding long strings across lines and retaining the layout. Given that the CPP lexer also recognises quoted strings, it looks like a difficult to reconcile mismatch. There would need be some other sort of joiner understood by GHC, where each string fragment is fully enclosed in quotes. Would the below be acceptable? {-# LANGUAGE CPP #-} module Main(main) where hello :: String hello = ##"Hello"\ ##"World!" main :: IO () main = print hello This is turned by CPP into either (version-dependent): {-# LANGUAGE CPP #-} module Main(main) where hello :: String hello = ##"Hello" ##"World!" main :: IO () main = print hello or: {-# LANGUAGE CPP #-} module Main(main) where hello :: String hello = ##"Hello" ##"World!" main :: IO () main = print hello which (or some suitable variant?) GHC could then also recognise as multiple fragments of the same single string literal? -- Viktor.