On Wed, Feb 18, 2004 at 10:48:39AM +0000, Graham Klyne wrote: > [To Haskell-cafe...] > > At 16:57 17/02/04 -0500, Andrew Pimlott wrote: > >On Tue, Feb 17, 2004 at 07:48:52PM +0000, Graham Klyne wrote: > >> [[ > >> notMatching :: Show a => GenParser tok st a -> GenParser tok st () > >> notMatching p = do { a <- try p ; unexpected (show a) } <|> return () > >> ]] > > > > notFollowedBy' :: Show a => GenParser tok st a -> GenParser tok st () > > notFollowedBy' p = do res <- do a <- try p; return $ Just a > > <|> > > return Nothing > > case res of Just a -> unexpected (show a) > > Nothing -> return () > > I don't see why that would work where the above case does not; i.e. when p > consumes no input.
Because (in my version) when p succeeds, the left side of <|> succeeds; in the original, the left side of <|> always failed. Instead of throwing the error immediately after p succeeds, I "package it up" in Just a and throw it later. So there is no possibility for the right side of <|> to be evaluated "by accident", as there was in the original. I think the key is to understand the paragraph in a previous message about the original implementation being a "dirty trick". Andrew _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe