How can I write multiline strings in Haskell?

Let's say I have this string literal with line breaks:

file :: String
file = "the first line\nthe second line\nthe third line"

Is there any way to write it like this?

file :: String
file = "the first line
        the second line
        the third line"

The attempt just above leads to this error:

factor.hs:58:33:
    lexical error in string/character literal at character '\n'
Failed, modules loaded: none.

You can write multiline strings like so

x = "This is some text which we escape \
      \   and unescape to keep writing"

Which prints as

"This is some text which we escape   and unescape to keep writing"

If you want this to print as two lines

x = "This is some text which we escape \n\
      \   and unescape to keep writing"

Which prints as

This is some text which we escape
    and unescape to keep writing

Some time ago I released a library named "neat-interpolation" to solve the problem of multiline strings and interpolation using the QuasiQoutes extension. Its primary advantage over competitors is a smart management of whitespace, which takes care of interpolated multiline strings. Following is an example of how it works.

Executing the following:

{-# LANGUAGE QuasiQuotes, OverloadedStrings #-}

import NeatInterpolation (text)
import qualified Data.Text.IO

f :: Text -> Text -> Text
f a b = 
  [text|
    function(){
      function(){
        $a
      }
      return $b
    }
  |]

main = Data.Text.IO.putStrLn $ f "1" "2"

will produce this (notice the reduced indentation compared to how it was declared):

function(){
  function(){
    1
  }
  return 2
}

Now let's test it with multiline string parameters:

main = Data.Text.IO.putStrLn $ f 
  "{\n\
  \  indented line\n\
  \  indented line\n\
  \}" 
  "{\n\
  \  indented line\n\
  \  indented line\n\
  \}"

We get

function(){
  function(){
    {
      indented line
      indented line
    }
  }
  return {
    indented line
    indented line
  }
}

Notice how it neatly preserved the indentation levels of lines the variable placeholders were at. The standard interpolators would have messed all the whitespace and produced something like the following instead:

    function(){
      function(){
        {
  indented line
  indented line
}
      }
      return {
  indented line
  indented line
}
    }

In Haskell you can type multiline strings by ending it with a backslash \ and beginning the newline with another \, just like so :

file :: String
file = "the first line\n\  
    \the second line\n\  
    \the third line\n"