How is this variable not in scope?
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 <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
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 <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
_______________________________________________ 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.
Excellent! Thanks, Alejandro! On Fri, Jul 21, 2017 at 12:52 AM, Alejandro Serrano Mena <trupill@gmail.com> wrote:
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 <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
_______________________________________________ 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.
-- Jeff Brown | Jeffrey Benjamin Brown Website <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
Another solution is to define `f` below `root` within the do block: ``` main' = do (root : inputFile :_) <- getArgs input <- readFile inputFile let pairs = pairFilesToContents $ readSmsnLines input let f :: (FilePath, String) -> IO () f (name, content) = writeFile (root+name) content mapM_ f pairs ``` On Fri, 21 Jul 2017 at 10:07 Jeffrey Brown <jeffbrown.the@gmail.com> wrote:
Excellent! Thanks, Alejandro!
On Fri, Jul 21, 2017 at 12:52 AM, Alejandro Serrano Mena < trupill@gmail.com> wrote:
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 <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
_______________________________________________ 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.
-- Jeff Brown | Jeffrey Benjamin Brown Website <https://msu.edu/~brown202/> | Facebook <https://www.facebook.com/mejeff.younotjeff> | LinkedIn <https://www.linkedin.com/in/jeffreybenjaminbrown>(spammy, so I often miss messages here) | Github <https://github.com/jeffreybenjaminbrown>
_______________________________________________ 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.
participants (3)
-
Adam Bergmark -
Alejandro Serrano Mena -
Jeffrey Brown