We add the spaces `Parser` which returns nothing `()` and skips any
spaces.
`spaces` is already defined in Parsec, but does not do exactly what we
want, we can hide it from the import.
`skipMany a` matches 0 or more `a` and skips them.
`>>` is the **bind** operator. It may have completely different meanings
depending on the monad you use. In the Parser monad in means "try the
first parameter, then try the second with anything that is left", i.e.
"first skip all the spaces, then match the symbol".
module Main where
-import Text.ParserCombinators.Parsec
+import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment
symbol :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
+spaces :: Parser ()
+spaces = skipMany space
+
readExpr :: String -> String
-readExpr input = case parse symbol "lisp" input of
+readExpr input = case parse (spaces >> symbol) "lisp" input of
Left err -> "No match: " ++ show err
Right val -> "Found value"