The problem is that in the "where" clause the only things which are in scope are (roughly) the arguments of the function. In particular, neither "root" nor "inputFile" nor "input" nor "pairs". The solution is to add an extra argument:

main' = do
  ...
  mapM_ (f root) pairs where
    f root (name, content) = writeFile (root ++ name) content

2017-07-21 9:28 GMT+02:00 Jeffrey Brown <jeffbrown.the@gmail.com>:
The following compiles and runs perfectly:

main = do
  (inputFile:_)  <- getArgs
  input <- readFile inputFile
  let pairs = pairFilesToContents $ readSmsnLines input
  mapM_ f pairs where
    f :: (FilePath, String) -> IO ()
    f (name, content) = writeFile name content

But the following triggers the error "Not in scope: ‘root’".

main' = do
  (root : inputFile :_)  <- getArgs
  input <- readFile inputFile
  let pairs = pairFilesToContents $ readSmsnLines input
  mapM_ f pairs where
    f :: (FilePath, String) -> IO ()
    f (name, content) = writeFile (root+name) content

--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github   

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.