The layout of your code is very important when writing haskell code: Your code : expr = do t <- term do symbol "+" e <- expr return e return (t + e) +++ return t

is equivalent to:

expr = do { t <- term
          ; do { symbol "+"
               ; e <- expr
               ; return e
               }
          ; return (t + e) -- e is not in scope
          }
       +++ return t -- t is not in scope
Both t and e are not in scope:
* e is in a nested do-block
* the expression 'return t' is outside the do-block


What you probably mean is: expr = do t <- term do symbol "+" e <- expr return (t + e) +++ return t

which is equivalent to:
expr = do { t <- term
; do { symbol "+"
; e <- expr -- (dropped the return e line)
; return (t + e)
}
+++ return t
}
Now t and e are in scope. The parser 'expr' will first recognize a 'term' and then try to recognize a '+' symbol followed by an expression. If that fails it returns 't'.


Cheers,

Arthur


On 15-mrt-05, at 16:28, Nicola Whitehead wrote:

Curiouser and curiouser...
 
expr :: Parser Int
expr = do t <- term
          do symbol "+"
             e <- expr
          return (t + e)
       +++ return t
solves the undefined variable problem but introduces a new 'Last operator in do {...} must be an expression' error, which then disappears if I explicitly return e
 
expr :: Parser Int
expr = do t <- term
          do symbol "+"
             e <- expr
             return e
          return (t + e)
       +++ return t


to give me the original undefined variable t error at the line expr = do t <- term . It looks in scope to me... :(
 
Thanks,
 
Nik
 
Dr Nik Freydís Whitehead
University of Akureyri, Iceland
*********************************************************************
Having the moral high ground is good.
Having the moral high ground and an FGMP-15 is better.
*********************************************************************
 
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to