[Haskell-cafe] Minim interpreter

Brandon Michael Moore brandon at heave.ugcs.caltech.edu
Fri Jul 20 17:27:59 EDT 2007


On Fri, Jul 20, 2007 at 10:10:58PM +0200, Hugh Perkins wrote:
> Newbie question: why does the following give "Not in scope 'c'" for the last
> line?

I assume you meant
 
> string :: Parsec.Parser String
> string = do c <- Parsec.letter
>             do cs <- string
>                return c:cs
>             Parsec.<|> return [c]

Without adding that indentation, the second do cuts of the first block
and you get a rather different error.

The problem here is that the line beginning Parsec.<|> is lined up
with the first token after do, so layout adds a semicolon in front
of it, but a statement can't begin with an operator, so to avoid that
parse error the layout rules add the close brace and end the do block.
It parses like this:

string = ( do { c <- Parsec.letter
              ; cs <- string
              ; return c:cs
              } )
        Parsec.<|> (return [c]

The parse error rule is there so a do block will be closed by the end of
surrounding parens or braces, maybe it has other uses.

In any case, you really ought to use many1.

> string = Parsec.many1 Parsec.letter

Brandon


More information about the Haskell-Cafe mailing list