
Monadic and applicative. blockCmnt :: Parser () blockCmnt = do string "{-" manyTill item (string "-}") return () manyTill p endp = scan where scan = do endp return [] <|> do x <- p xs <- scan return (x:xs) blockCmnt' :: Parser () blockCmnt' = string "{-" >> manyTill item (string "-}") >> return () manyTill' p endp = scan' where scan' = endp *> return [] <|> pure (:) <*> p <*> scan’ Thanks. M
On 18 Mar 2017, at 21:47, Francesco Ariis
wrote: On Sat, Mar 18, 2017 at 09:11:20PM +0000, mike h wrote:
Hi,
Below is code I’m building up for simple monadic and applicative parsers from first principles.
Hello Mike, You might want to check `manyTill` from Parsec to get an idea:
manyTill :: (Stream s m t) => ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a] manyTill p end = scan where scan = do { end; return [] } <|> do { x <- p; xs <- scan; return (x:xs) }
The 'trick' lies in <|> (alternative). Does that help? _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners