Fake Marquee Text in Haskell
use replicate a ' ' instead of concat $ take a $ repeat " "
use pattern matching in main to check that there are exactly two arguments and use it also for read to check that the width is exactly a number. With [(width,_)] you accept also strings that only start with a number, such as "1O" where probably you made a mistake and you wrote it instead of "10"
lead and end can be specific to format to avoid exposing them. Actually you can also remove them and just write "    [" ++ xs ++ "]"
scroll can be simplified and both the helper and the format function can should be only visible to it
don't concat the output together before writing it: just write each line in output. UseforM_ for multiple IO operations over a list of values.


So, my rewrite of your code is

import Control.Monad (forM_)
import System.Environment
import System.Exit
import System.IO


scroll :: Int -&gt; [Char] -&gt; [[Char]]
scroll a = reverse . scrollHelp [] . addSpaces
  where
    addSpaces xs = replicate a ' ' ++ xs ++ replicate a ' '
    scrollHelp acc str
      | length str &lt; a = acc
      | otherwise      = let group = take a str
                         in scrollHelp (format group:acc) (tail str)
    format xs = "    [" ++ xs ++ "]"

main = do
  args &lt;- getArgs
  case args of
    (widthString:text:[]) -&gt;
       case reads widthString of
         [(width,"")] -&gt; forM_ (scroll width text) putStrLn 
         _ -&gt; hPutStrLn stderr $ "width must be an integer, got '" ++ widthString ++ "'"
    _ -&gt; do
      name &lt;- getProgName
      hPutStrLn stderr $ "usage: " ++ name ++ " &lt;marquee width&gt; &lt;text to marquee&gt;"
      exitFailure