
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