[Haskell-cafe] Another monad question...
Stefan O'Rear
stefanor at cox.net
Sat Jul 14 23:42:19 EDT 2007
On Sat, Jul 14, 2007 at 11:26:56PM -0400, David LaPalomento wrote:
> I've been playing with the parsers decribed in "Monadic Parser Combinators"
> (http://www.cs.nott.ac.uk/~gmh/bib.html#monparsing) and I've gotten
> stumped. I'm trying to get comfortable working monadically, so please
> excuse my ignorance. Here's the relevant portions of my code:
You don't need to excuse yourself. If you *ever* feel as though you
might regret a question, we have failed. The point of this list is for
newbies to ask questions and learn!
>
[reordered]
> -- word parses everything as []
> word :: Parser String
> word = mzero `mplus` do
> x <- letter;
> xs <- word;
> return (x:xs)
>
> As I noted in the code, no matter what inputs I give it,
>> parse word "blah blah"
> always returns []. Any ideas where where my misunderstanding is?
Your base case is subtly wrong - it should be return [], not mzero.
Mzero always fails - mzero `mplus` x = x, by one of the MonadPlus laws.
> sat :: (Char -> Bool) -> Parser Char
> sat p = Parser (\inp -> [ (v, out) | (v, out) <- parse item inp, p v])
>
> lower :: Parser Char
> lower = Parser (\inp -> parse (sat (\x -> 'a' <= x && x <= 'z')) inp)
>
> upper :: Parser Char
> upper = Parser (\inp -> parse (sat (\x -> 'A' <= x && x <= 'Z')) inp)
These definitions aren't in the best style; while they are correct, I
would prefer to write them as:
sat :: (Char -> Bool) -> Parser Char
sat p = do { ch <- item ; guard (p ch) ; return ch }
lower :: Parser Char
lower = sat isLower
upper :: Parser Char
upper = sat isUpper
Stefan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20070714/8294094c/attachment.bin
More information about the Haskell-Cafe
mailing list